This is an automated email from the ASF dual-hosted git repository.
vatsrahul1001 pushed a commit to branch v3-3-test
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/v3-3-test by this push:
new a0526899cca [v3-3-test] Raise the datamodel-code-generator floor for
the codegen toolchain (#70670) (#70976)
a0526899cca is described below
commit a0526899cca46452938c849e5e2c09df6479e28e
Author: Rahul Vats <[email protected]>
AuthorDate: Tue Aug 4 19:31:25 2026 +0530
[v3-3-test] Raise the datamodel-code-generator floor for the codegen
toolchain (#70670) (#70976)
* Raise the datamodel-code-generator floor for the codegen toolchain
(#70670)
(cherry picked from commit b3014293344d7e0fdce8bc62e9b6bb97c39baca2)
Manual backport: datamodel-code-generator floor bumped 0.33.0 -> >=0.71.0
and
models REGENERATED against v3-3-test's own spec (not copied from main). Test
constructions in test_operations.py updated for the now-required nullable
fields.
test_task_command.py is main-only; main's divergent test_operations.py tail
(ctl task-instance ops not on this branch) intentionally not backported.
* Fix ConnectionResponse construction to use schema alias in airflow-ctl
test
The regenerated model exposes the field as `schema_` with
`Field(alias="schema")`
and no `populate_by_name`, so pydantic requires the alias `schema=` at
construction.
Matches main's fix (#70670): construct with `schema=` plus `# type:
ignore[call-arg]`.
* Serialize connection mock responses by alias in airflow-ctl tests
ConnectionResponse.schema_ has Field(alias=schema) and no populate_by_name,
so the
source validates responses by the schema alias. The mock handlers dumped
the model
by field name, breaking the round-trip. Dump connection_response /
connections_response
mocks with by_alias=True (matches main #70670).
* Regenerate airflow-ctl datamodels after merging v3-3-test
The #70127/#69719 reverts (now on v3-3-test) removed BackfillDagRunResponse,
BackfillDagRunCollectionResponse and bundle_version from the API spec.
Regenerated
generated.py from the current spec with datamodel-code-generator>=0.71.0 so
it reflects
the reverts in the new-tool format. mypy airflow-ctl clean; no tests
reference the removed models.
---
.../airflow/api_fastapi/execution_api/AGENTS.md | 4 +-
.../cli/commands/test_rotate_fernet_key_command.py | 2 +-
.../tests/unit/dag_processing/test_processor.py | 8 +
airflow-ctl/pyproject.toml | 2 +-
.../airflowctl/api/datamodels/auth_generated.py | 2 +-
.../src/airflowctl/api/datamodels/generated.py | 379 ++++++++--------
.../tests/airflow_ctl/api/test_operations.py | 65 ++-
.../ctl/commands/test_connections_command.py | 4 +-
.../airflow_ctl/ctl/commands/test_dag_command.py | 9 +
.../ctl/commands/test_variable_command.py | 5 +-
devel-common/src/tests_common/pytest_plugin.py | 3 +
.../tests/unit/amazon/aws/hooks/test_base_aws.py | 6 +
.../unit/openlineage/plugins/test_listener.py | 14 +-
task-sdk/pyproject.toml | 2 +-
.../src/airflow/sdk/api/datamodels/_generated.py | 106 ++---
.../airflow/sdk/execution_time/schema/schema.json | 494 +++++++++++----------
task-sdk/tests/conftest.py | 2 +
task-sdk/tests/task_sdk/api/test_client.py | 14 +
task-sdk/tests/task_sdk/bases/test_hook.py | 2 +
.../tests/task_sdk/definitions/test_connection.py | 11 +-
.../execution_time/test_callback_supervisor.py | 22 +-
.../tests/task_sdk/execution_time/test_comms.py | 1 +
.../tests/task_sdk/execution_time/test_context.py | 50 ++-
.../task_sdk/execution_time/test_context_cache.py | 17 +-
.../tests/task_sdk/execution_time/test_secrets.py | 3 +
.../task_sdk/execution_time/test_supervisor.py | 80 +++-
.../task_sdk/execution_time/test_task_runner.py | 9 +
uv.lock | 17 +-
28 files changed, 811 insertions(+), 522 deletions(-)
diff --git a/airflow-core/src/airflow/api_fastapi/execution_api/AGENTS.md
b/airflow-core/src/airflow/api_fastapi/execution_api/AGENTS.md
index aff91c070d9..4cacd2368ba 100644
--- a/airflow-core/src/airflow/api_fastapi/execution_api/AGENTS.md
+++ b/airflow-core/src/airflow/api_fastapi/execution_api/AGENTS.md
@@ -16,7 +16,7 @@ Workers and API servers deploy independently, so backward
compatibility is criti
3. Regenerate Task SDK models:
```bash
-cd task-sdk && python dev/generate_task_sdk_models.py
+uv run --active --group codegen --project apache-airflow-task-sdk --directory
task-sdk -s dev/generate_task_sdk_models.py
```
4. Add tests for both the new and previous API versions.
@@ -44,7 +44,7 @@ Adding a new Execution API feature touches multiple packages.
All of these must
5. **Task SDK client** — add the client method in
`task-sdk/src/airflow/sdk/api/client.py`.
6. **Supervisor** — handle the new message in
`task-sdk/src/airflow/sdk/execution_time/supervisor.py`.
7. **Dag processor & triggerer exclusions** — these use
`InProcessExecutionAPI` and have explicit message type unions. Add new types to
their handler or exclusion lists in `airflow/dag_processing/processor.py` and
`airflow/jobs/triggerer_job_runner.py`.
-8. **Regenerate models** — `cd task-sdk && python
dev/generate_task_sdk_models.py`.
+8. **Regenerate models** — `uv run --active --group codegen --project
apache-airflow-task-sdk --directory task-sdk -s
dev/generate_task_sdk_models.py`.
9. **Tests** — if the new message type requires an API endpoint, add tests in
all of these:
- `airflow-core/tests/unit/api_fastapi/execution_api/` — endpoint tests
- `task-sdk/tests/task_sdk/api/test_client.py` — client method tests
diff --git
a/airflow-core/tests/unit/cli/commands/test_rotate_fernet_key_command.py
b/airflow-core/tests/unit/cli/commands/test_rotate_fernet_key_command.py
index b2c5ad1b140..ec661a156f2 100644
--- a/airflow-core/tests/unit/cli/commands/test_rotate_fernet_key_command.py
+++ b/airflow-core/tests/unit/cli/commands/test_rotate_fernet_key_command.py
@@ -123,7 +123,7 @@ class TestRotateFernetKeyCommand:
host=conn.host,
login=conn.login,
password=conn.password,
- schema_=conn.schema,
+ schema=conn.schema,
port=conn.port,
extra=conn.extra,
)
diff --git a/airflow-core/tests/unit/dag_processing/test_processor.py
b/airflow-core/tests/unit/dag_processing/test_processor.py
index 2da26aab124..dcdd614fb7a 100644
--- a/airflow-core/tests/unit/dag_processing/test_processor.py
+++ b/airflow-core/tests/unit/dag_processing/test_processor.py
@@ -2167,6 +2167,10 @@ class TestDagFileProcessorProcess:
conn_type="mysql",
password="super-secret-password",
extra='{"api_key":"super-secret-extra"}',
+ host=None,
+ schema=None,
+ login=None,
+ port=None,
)
with (
@@ -2197,6 +2201,10 @@ class TestDagFileProcessorProcess:
"conn_type": "mysql",
"password": "super-secret-password",
"extra": '{"api_key":"super-secret-extra"}',
+ "host": None,
+ "schema": None,
+ "login": None,
+ "port": None,
"type": "ConnectionResult",
}
diff --git a/airflow-ctl/pyproject.toml b/airflow-ctl/pyproject.toml
index 961b4a6c23e..a29986429c5 100644
--- a/airflow-ctl/pyproject.toml
+++ b/airflow-ctl/pyproject.toml
@@ -149,7 +149,7 @@ dev = [
"apache-airflow-devel-common",
]
codegen = [
- "datamodel-code-generator[http]==0.33.0",
+ "datamodel-code-generator[http]>=0.71.0",
"apache-airflow-devel-common"
]
diff --git a/airflow-ctl/src/airflowctl/api/datamodels/auth_generated.py
b/airflow-ctl/src/airflowctl/api/datamodels/auth_generated.py
index ec8d9c16b22..9204ee0c583 100644
--- a/airflow-ctl/src/airflowctl/api/datamodels/auth_generated.py
+++ b/airflow-ctl/src/airflowctl/api/datamodels/auth_generated.py
@@ -1,6 +1,6 @@
# generated by datamodel-codegen:
# filename: v2-simple-auth-manager-generated.yaml
-# version: 0.33.0
+# version: 0.71.0
from __future__ import annotations
diff --git a/airflow-ctl/src/airflowctl/api/datamodels/generated.py
b/airflow-ctl/src/airflowctl/api/datamodels/generated.py
index 746ba1e02da..60a6cd33c96 100644
--- a/airflow-ctl/src/airflowctl/api/datamodels/generated.py
+++ b/airflow-ctl/src/airflowctl/api/datamodels/generated.py
@@ -1,6 +1,6 @@
# generated by datamodel-codegen:
# filename: v2-rest-api-generated.yaml
-# version: 0.33.0
+# version: 0.71.0
from __future__ import annotations
@@ -102,7 +102,7 @@ class BaseInfoResponse(BaseModel):
Base info serializer for responses.
"""
- status: Annotated[str | None, Field(title="Status")] = None
+ status: Annotated[str | None, Field(title="Status")]
class BulkActionNotOnExistence(str, Enum):
@@ -229,8 +229,8 @@ class ClearPartitionsResponse(BaseModel):
dry_run: Annotated[bool, Field(title="Dry Run")]
-class TaskIds(RootModel[list]):
- root: Annotated[list, Field(max_length=2, min_length=2)]
+class TaskIds(RootModel[tuple[str, int]]):
+ root: Annotated[tuple[str, int], Field(max_length=2, min_length=2)]
class ClearTaskInstancesBody(BaseModel):
@@ -270,8 +270,8 @@ class ClearTaskInstancesBody(BaseModel):
note: Annotated[Note | None, Field(title="Note")] = None
-class Value(RootModel[list]):
- root: Annotated[list, Field(max_length=2, min_length=2, title="Value")]
+class Value(RootModel[tuple[str, str]]):
+ root: Annotated[tuple[str, str], Field(max_length=2, min_length=2,
title="Value")]
class ConfigOption(BaseModel):
@@ -329,14 +329,14 @@ class ConnectionResponse(BaseModel):
connection_id: Annotated[str, Field(title="Connection Id")]
conn_type: Annotated[str, Field(title="Conn Type")]
- description: Annotated[str | None, Field(title="Description")] = None
- host: Annotated[str | None, Field(title="Host")] = None
- login: Annotated[str | None, Field(title="Login")] = None
- schema_: Annotated[str | None, Field(alias="schema", title="Schema")] =
None
- port: Annotated[int | None, Field(title="Port")] = None
- password: Annotated[str | None, Field(title="Password")] = None
- extra: Annotated[str | None, Field(title="Extra")] = None
- team_name: Annotated[str | None, Field(title="Team Name")] = None
+ description: Annotated[str | None, Field(title="Description")]
+ host: Annotated[str | None, Field(title="Host")]
+ login: Annotated[str | None, Field(title="Login")]
+ schema_: Annotated[str | None, Field(alias="schema", title="Schema")]
+ port: Annotated[int | None, Field(title="Port")]
+ password: Annotated[str | None, Field(title="Password")]
+ extra: Annotated[str | None, Field(title="Extra")]
+ team_name: Annotated[str | None, Field(title="Team Name")]
class ConnectionTestQueuedResponse(BaseModel):
@@ -459,9 +459,9 @@ class DAGSourceResponse(BaseModel):
Dag Source serializer for responses.
"""
- content: Annotated[str | None, Field(title="Content")] = None
+ content: Annotated[str | None, Field(title="Content")]
dag_id: Annotated[str, Field(title="Dag Id")]
- version_number: Annotated[int | None, Field(title="Version Number")] = None
+ version_number: Annotated[int | None, Field(title="Version Number")]
dag_display_name: Annotated[str, Field(title="Dag Display Name")]
@@ -479,10 +479,8 @@ class DagProcessorInfoResponse(BaseModel):
DagProcessor info serializer for responses.
"""
- status: Annotated[str | None, Field(title="Status")] = None
- latest_dag_processor_heartbeat: Annotated[str | None, Field(title="Latest
Dag Processor Heartbeat")] = (
- None
- )
+ status: Annotated[str | None, Field(title="Status")]
+ latest_dag_processor_heartbeat: Annotated[str | None, Field(title="Latest
Dag Processor Heartbeat")]
class DagRunAssetReference(BaseModel):
@@ -495,13 +493,13 @@ class DagRunAssetReference(BaseModel):
)
run_id: Annotated[str, Field(title="Run Id")]
dag_id: Annotated[str, Field(title="Dag Id")]
- logical_date: Annotated[datetime | None, Field(title="Logical Date")] =
None
+ logical_date: Annotated[datetime | None, Field(title="Logical Date")]
start_date: Annotated[datetime, Field(title="Start Date")]
- end_date: Annotated[datetime | None, Field(title="End Date")] = None
+ end_date: Annotated[datetime | None, Field(title="End Date")]
state: Annotated[str, Field(title="State")]
- data_interval_start: Annotated[datetime | None, Field(title="Data Interval
Start")] = None
- data_interval_end: Annotated[datetime | None, Field(title="Data Interval
End")] = None
- partition_key: Annotated[str | None, Field(title="Partition Key")] = None
+ data_interval_start: Annotated[datetime | None, Field(title="Data Interval
Start")]
+ data_interval_end: Annotated[datetime | None, Field(title="Data Interval
End")]
+ partition_key: Annotated[str | None, Field(title="Partition Key")]
class DagRunMutableStates(str, Enum):
@@ -597,11 +595,11 @@ class DagVersionResponse(BaseModel):
id: Annotated[UUID, Field(title="Id")]
version_number: Annotated[int, Field(title="Version Number")]
dag_id: Annotated[str, Field(title="Dag Id")]
- bundle_name: Annotated[str | None, Field(title="Bundle Name")] = None
- bundle_version: Annotated[str | None, Field(title="Bundle Version")] = None
+ bundle_name: Annotated[str | None, Field(title="Bundle Name")]
+ bundle_version: Annotated[str | None, Field(title="Bundle Version")]
created_at: Annotated[datetime, Field(title="Created At")]
dag_display_name: Annotated[str, Field(title="Dag Display Name")]
- bundle_url: Annotated[str | None, Field(title="Bundle Url")] = None
+ bundle_url: Annotated[str | None, Field(title="Bundle Url")]
class DagWarningType(str, Enum):
@@ -622,9 +620,9 @@ class DryRunBackfillResponse(BaseModel):
Backfill serializer for responses in dry-run mode.
"""
- logical_date: Annotated[datetime | None, Field(title="Logical Date")] =
None
- partition_key: Annotated[str | None, Field(title="Partition Key")] = None
- partition_date: Annotated[datetime | None, Field(title="Partition Date")]
= None
+ logical_date: Annotated[datetime | None, Field(title="Logical Date")]
+ partition_key: Annotated[str | None, Field(title="Partition Key")]
+ partition_date: Annotated[datetime | None, Field(title="Partition Date")]
class EventLogResponse(BaseModel):
@@ -634,15 +632,15 @@ class EventLogResponse(BaseModel):
event_log_id: Annotated[int, Field(title="Event Log Id")]
when: Annotated[datetime, Field(title="When")]
- dag_id: Annotated[str | None, Field(title="Dag Id")] = None
- task_id: Annotated[str | None, Field(title="Task Id")] = None
- run_id: Annotated[str | None, Field(title="Run Id")] = None
- map_index: Annotated[int | None, Field(title="Map Index")] = None
- try_number: Annotated[int | None, Field(title="Try Number")] = None
+ dag_id: Annotated[str | None, Field(title="Dag Id")]
+ task_id: Annotated[str | None, Field(title="Task Id")]
+ run_id: Annotated[str | None, Field(title="Run Id")]
+ map_index: Annotated[int | None, Field(title="Map Index")]
+ try_number: Annotated[int | None, Field(title="Try Number")]
event: Annotated[str, Field(title="Event")]
- logical_date: Annotated[datetime | None, Field(title="Logical Date")] =
None
- owner: Annotated[str | None, Field(title="Owner")] = None
- extra: Annotated[str | None, Field(title="Extra")] = None
+ logical_date: Annotated[datetime | None, Field(title="Logical Date")]
+ owner: Annotated[str | None, Field(title="Owner")]
+ extra: Annotated[str | None, Field(title="Extra")]
dag_display_name: Annotated[str | None, Field(title="Dag Display Name")] =
None
task_display_name: Annotated[str | None, Field(title="Task Display Name")]
= None
@@ -741,7 +739,7 @@ class ImportErrorResponse(BaseModel):
import_error_id: Annotated[int, Field(title="Import Error Id")]
timestamp: Annotated[datetime, Field(title="Timestamp")]
filename: Annotated[str, Field(title="Filename")]
- bundle_name: Annotated[str | None, Field(title="Bundle Name")] = None
+ bundle_name: Annotated[str | None, Field(title="Bundle Name")]
stack_trace: Annotated[str, Field(title="Stack Trace")]
@@ -751,15 +749,15 @@ class JobResponse(BaseModel):
"""
id: Annotated[int, Field(title="Id")]
- dag_id: Annotated[str | None, Field(title="Dag Id")] = None
- state: Annotated[str | None, Field(title="State")] = None
- job_type: Annotated[str | None, Field(title="Job Type")] = None
- start_date: Annotated[datetime | None, Field(title="Start Date")] = None
- end_date: Annotated[datetime | None, Field(title="End Date")] = None
- latest_heartbeat: Annotated[datetime | None, Field(title="Latest
Heartbeat")] = None
- executor_class: Annotated[str | None, Field(title="Executor Class")] = None
- hostname: Annotated[str | None, Field(title="Hostname")] = None
- unixname: Annotated[str | None, Field(title="Unixname")] = None
+ dag_id: Annotated[str | None, Field(title="Dag Id")]
+ state: Annotated[str | None, Field(title="State")]
+ job_type: Annotated[str | None, Field(title="Job Type")]
+ start_date: Annotated[datetime | None, Field(title="Start Date")]
+ end_date: Annotated[datetime | None, Field(title="End Date")]
+ latest_heartbeat: Annotated[datetime | None, Field(title="Latest
Heartbeat")]
+ executor_class: Annotated[str | None, Field(title="Executor Class")]
+ hostname: Annotated[str | None, Field(title="Hostname")]
+ unixname: Annotated[str | None, Field(title="Unixname")]
dag_display_name: Annotated[str | None, Field(title="Dag Display Name")] =
None
@@ -865,7 +863,7 @@ class PoolResponse(BaseModel):
scheduled_slots: Annotated[int, Field(title="Scheduled Slots")]
open_slots: Annotated[int, Field(title="Open Slots")]
deferred_slots: Annotated[int, Field(title="Deferred Slots")]
- team_name: Annotated[str | None, Field(title="Team Name")] = None
+ team_name: Annotated[str | None, Field(title="Team Name")]
class ProviderResponse(BaseModel):
@@ -876,7 +874,7 @@ class ProviderResponse(BaseModel):
package_name: Annotated[str, Field(title="Package Name")]
description: Annotated[str, Field(title="Description")]
version: Annotated[str, Field(title="Version")]
- documentation_url: Annotated[str | None, Field(title="Documentation Url")]
= None
+ documentation_url: Annotated[str | None, Field(title="Documentation Url")]
class QueuedEventResponse(BaseModel):
@@ -935,8 +933,8 @@ class SchedulerInfoResponse(BaseModel):
Scheduler info serializer for responses.
"""
- status: Annotated[str | None, Field(title="Status")] = None
- latest_scheduler_heartbeat: Annotated[str | None, Field(title="Latest
Scheduler Heartbeat")] = None
+ status: Annotated[str | None, Field(title="Status")]
+ latest_scheduler_heartbeat: Annotated[str | None, Field(title="Latest
Scheduler Heartbeat")]
class StructuredLogMessage(BaseModel):
@@ -1042,7 +1040,7 @@ class TaskInstancesLogResponse(BaseModel):
"""
content: Annotated[list[StructuredLogMessage] | list[str],
Field(title="Content")]
- continuation_token: Annotated[str | None, Field(title="Continuation
Token")] = None
+ continuation_token: Annotated[str | None, Field(title="Continuation
Token")]
class TaskOutletAssetReference(BaseModel):
@@ -1074,7 +1072,7 @@ class TaskStateStoreBody(BaseModel):
extra="forbid",
)
value: JsonValue
- expires_at: Annotated[datetime | str | None, Field(title="Expires At")] =
"default"
+ expires_at: Annotated[datetime | Literal["default"] | None,
Field(title="Expires At")] = "default"
class TaskStateStorePatchBody(BaseModel):
@@ -1096,7 +1094,7 @@ class TaskStateStoreResponse(BaseModel):
key: Annotated[str, Field(title="Key")]
value: JsonValue
updated_at: Annotated[datetime, Field(title="Updated At")]
- expires_at: Annotated[datetime | None, Field(title="Expires At")] = None
+ expires_at: Annotated[datetime | None, Field(title="Expires At")]
class TimeDelta(BaseModel):
@@ -1121,7 +1119,7 @@ class TriggerDAGRunPostBody(BaseModel):
dag_run_id: Annotated[str | None, Field(title="Dag Run Id")] = None
data_interval_start: Annotated[datetime | None, Field(title="Data Interval
Start")] = None
data_interval_end: Annotated[datetime | None, Field(title="Data Interval
End")] = None
- logical_date: Annotated[datetime | None, Field(title="Logical Date")] =
None
+ logical_date: Annotated[datetime | None, Field(title="Logical Date")]
run_after: Annotated[datetime | None, Field(title="Run After")] = None
conf: Annotated[dict[str, Any] | None, Field(title="Conf")] = None
note: Annotated[str | None, Field(title="Note")] = None
@@ -1135,10 +1133,10 @@ class TriggerResponse(BaseModel):
id: Annotated[int, Field(title="Id")]
classpath: Annotated[str, Field(title="Classpath")]
- kwargs: Annotated[str, Field(title="Kwargs")]
+ kwargs: Annotated[str, Field(deprecated=True, title="Kwargs")]
created_date: Annotated[datetime, Field(title="Created Date")]
- queue: Annotated[str | None, Field(title="Queue")] = None
- triggerer_id: Annotated[int | None, Field(title="Triggerer Id")] = None
+ queue: Annotated[str | None, Field(title="Queue")]
+ triggerer_id: Annotated[int | None, Field(title="Triggerer Id")]
class TriggererInfoResponse(BaseModel):
@@ -1146,8 +1144,8 @@ class TriggererInfoResponse(BaseModel):
Triggerer info serializer for responses.
"""
- status: Annotated[str | None, Field(title="Status")] = None
- latest_triggerer_heartbeat: Annotated[str | None, Field(title="Latest
Triggerer Heartbeat")] = None
+ status: Annotated[str | None, Field(title="Status")]
+ latest_triggerer_heartbeat: Annotated[str | None, Field(title="Latest
Triggerer Heartbeat")]
class UpdateHITLDetailPayload(BaseModel):
@@ -1188,9 +1186,9 @@ class VariableResponse(BaseModel):
key: Annotated[str, Field(title="Key")]
value: Annotated[str | None, Field(title="Value")] = None
- description: Annotated[str | None, Field(title="Description")] = None
+ description: Annotated[str | None, Field(title="Description")]
is_encrypted: Annotated[bool, Field(title="Is Encrypted")]
- team_name: Annotated[str | None, Field(title="Team Name")] = None
+ team_name: Annotated[str | None, Field(title="Team Name")]
class VersionInfo(BaseModel):
@@ -1199,7 +1197,7 @@ class VersionInfo(BaseModel):
"""
version: Annotated[str, Field(title="Version")]
- git_version: Annotated[str | None, Field(title="Git Version")] = None
+ git_version: Annotated[str | None, Field(title="Git Version")]
class XComCreateBody(BaseModel):
@@ -1222,7 +1220,7 @@ class XComResponse(BaseModel):
key: Annotated[str, Field(title="Key")]
timestamp: Annotated[datetime, Field(title="Timestamp")]
- logical_date: Annotated[datetime | None, Field(title="Logical Date")] =
None
+ logical_date: Annotated[datetime | None, Field(title="Logical Date")]
map_index: Annotated[int, Field(title="Map Index")]
task_id: Annotated[str, Field(title="Task Id")]
dag_id: Annotated[str, Field(title="Dag Id")]
@@ -1239,7 +1237,7 @@ class XComResponseNative(BaseModel):
key: Annotated[str, Field(title="Key")]
timestamp: Annotated[datetime, Field(title="Timestamp")]
- logical_date: Annotated[datetime | None, Field(title="Logical Date")] =
None
+ logical_date: Annotated[datetime | None, Field(title="Logical Date")]
map_index: Annotated[int, Field(title="Map Index")]
task_id: Annotated[str, Field(title="Task Id")]
dag_id: Annotated[str, Field(title="Dag Id")]
@@ -1257,7 +1255,7 @@ class XComResponseString(BaseModel):
key: Annotated[str, Field(title="Key")]
timestamp: Annotated[datetime, Field(title="Timestamp")]
- logical_date: Annotated[datetime | None, Field(title="Logical Date")] =
None
+ logical_date: Annotated[datetime | None, Field(title="Logical Date")]
map_index: Annotated[int, Field(title="Map Index")]
task_id: Annotated[str, Field(title="Task Id")]
dag_id: Annotated[str, Field(title="Dag Id")]
@@ -1265,7 +1263,7 @@ class XComResponseString(BaseModel):
dag_display_name: Annotated[str, Field(title="Dag Display Name")]
task_display_name: Annotated[str, Field(title="Task Display Name")]
run_after: Annotated[datetime, Field(title="Run After")]
- value: Annotated[str | None, Field(title="Value")] = None
+ value: Annotated[str | None, Field(title="Value")]
class XComUpdateBody(BaseModel):
@@ -1396,12 +1394,12 @@ class BackfillResponse(BaseModel):
dag_id: Annotated[str, Field(title="Dag Id")]
from_date: Annotated[datetime, Field(title="From Date")]
to_date: Annotated[datetime, Field(title="To Date")]
- dag_run_conf: Annotated[dict[str, Any] | None, Field(title="Dag Run
Conf")] = None
+ dag_run_conf: Annotated[dict[str, Any] | None, Field(title="Dag Run Conf")]
is_paused: Annotated[bool, Field(title="Is Paused")]
reprocess_behavior: ReprocessBehavior
max_active_runs: Annotated[int, Field(title="Max Active Runs")]
created_at: Annotated[datetime, Field(title="Created At")]
- completed_at: Annotated[datetime | None, Field(title="Completed At")] =
None
+ completed_at: Annotated[datetime | None, Field(title="Completed At")]
updated_at: Annotated[datetime, Field(title="Updated At")]
dag_display_name: Annotated[str, Field(title="Dag Display Name")]
@@ -1713,47 +1711,45 @@ class DAGDetailsResponse(BaseModel):
dag_display_name: Annotated[str, Field(title="Dag Display Name")]
is_paused: Annotated[bool, Field(title="Is Paused")]
is_stale: Annotated[bool, Field(title="Is Stale")]
- last_parsed_time: Annotated[datetime | None, Field(title="Last Parsed
Time")] = None
- last_parse_duration: Annotated[float | None, Field(title="Last Parse
Duration")] = None
- last_expired: Annotated[datetime | None, Field(title="Last Expired")] =
None
- bundle_name: Annotated[str | None, Field(title="Bundle Name")] = None
- bundle_version: Annotated[str | None, Field(title="Bundle Version")] = None
- relative_fileloc: Annotated[str | None, Field(title="Relative Fileloc")] =
None
+ last_parsed_time: Annotated[datetime | None, Field(title="Last Parsed
Time")]
+ last_parse_duration: Annotated[float | None, Field(title="Last Parse
Duration")]
+ last_expired: Annotated[datetime | None, Field(title="Last Expired")]
+ bundle_name: Annotated[str | None, Field(title="Bundle Name")]
+ bundle_version: Annotated[str | None, Field(title="Bundle Version")]
+ relative_fileloc: Annotated[str | None, Field(title="Relative Fileloc")]
fileloc: Annotated[str, Field(title="Fileloc")]
- description: Annotated[str | None, Field(title="Description")] = None
- timetable_summary: Annotated[str | None, Field(title="Timetable Summary")]
= None
- timetable_description: Annotated[str | None, Field(title="Timetable
Description")] = None
+ description: Annotated[str | None, Field(title="Description")]
+ timetable_summary: Annotated[str | None, Field(title="Timetable Summary")]
+ timetable_description: Annotated[str | None, Field(title="Timetable
Description")]
timetable_partitioned: Annotated[bool, Field(title="Timetable
Partitioned")]
timetable_periodic: Annotated[bool, Field(title="Timetable Periodic")]
tags: Annotated[list[DagTagResponse], Field(title="Tags")]
max_active_tasks: Annotated[int, Field(title="Max Active Tasks")]
- max_active_runs: Annotated[int | None, Field(title="Max Active Runs")] =
None
+ max_active_runs: Annotated[int | None, Field(title="Max Active Runs")]
max_consecutive_failed_dag_runs: Annotated[int, Field(title="Max
Consecutive Failed Dag Runs")]
has_task_concurrency_limits: Annotated[bool, Field(title="Has Task
Concurrency Limits")]
has_import_errors: Annotated[bool, Field(title="Has Import Errors")]
- next_dagrun_logical_date: Annotated[datetime | None, Field(title="Next
Dagrun Logical Date")] = None
+ next_dagrun_logical_date: Annotated[datetime | None, Field(title="Next
Dagrun Logical Date")]
next_dagrun_data_interval_start: Annotated[
datetime | None, Field(title="Next Dagrun Data Interval Start")
- ] = None
- next_dagrun_data_interval_end: Annotated[
- datetime | None, Field(title="Next Dagrun Data Interval End")
- ] = None
- next_dagrun_run_after: Annotated[datetime | None, Field(title="Next Dagrun
Run After")] = None
- allowed_run_types: Annotated[list[DagRunType] | None, Field(title="Allowed
Run Types")] = None
+ ]
+ next_dagrun_data_interval_end: Annotated[datetime | None,
Field(title="Next Dagrun Data Interval End")]
+ next_dagrun_run_after: Annotated[datetime | None, Field(title="Next Dagrun
Run After")]
+ allowed_run_types: Annotated[list[DagRunType] | None, Field(title="Allowed
Run Types")]
owners: Annotated[list[str], Field(title="Owners")]
catchup: Annotated[bool, Field(title="Catchup")]
- dag_run_timeout: Annotated[timedelta | None, Field(title="Dag Run
Timeout")] = None
- asset_expression: Annotated[dict[str, Any] | None, Field(title="Asset
Expression")] = None
- doc_md: Annotated[str | None, Field(title="Doc Md")] = None
- start_date: Annotated[datetime | None, Field(title="Start Date")] = None
- end_date: Annotated[datetime | None, Field(title="End Date")] = None
- is_paused_upon_creation: Annotated[bool | None, Field(title="Is Paused
Upon Creation")] = None
- params: Annotated[dict[str, Any] | None, Field(title="Params")] = None
+ dag_run_timeout: Annotated[timedelta | None, Field(title="Dag Run
Timeout")]
+ asset_expression: Annotated[dict[str, Any] | None, Field(title="Asset
Expression")]
+ doc_md: Annotated[str | None, Field(title="Doc Md")]
+ start_date: Annotated[datetime | None, Field(title="Start Date")]
+ end_date: Annotated[datetime | None, Field(title="End Date")]
+ is_paused_upon_creation: Annotated[bool | None, Field(title="Is Paused
Upon Creation")]
+ params: Annotated[dict[str, Any] | None, Field(title="Params")]
render_template_as_native_obj: Annotated[bool, Field(title="Render
Template As Native Obj")]
- template_search_path: Annotated[list[str] | None, Field(title="Template
Search Path")] = None
- timezone: Annotated[str | None, Field(title="Timezone")] = None
- last_parsed: Annotated[datetime | None, Field(title="Last Parsed")] = None
- default_args: Annotated[dict[str, Any] | None, Field(title="Default
Args")] = None
+ template_search_path: Annotated[list[str] | None, Field(title="Template
Search Path")]
+ timezone: Annotated[str | None, Field(title="Timezone")]
+ last_parsed: Annotated[datetime | None, Field(title="Last Parsed")]
+ default_args: Annotated[dict[str, Any] | None, Field(title="Default Args")]
rerun_with_latest_version: Annotated[bool | None, Field(title="Rerun With
Latest Version")] = None
owner_links: Annotated[dict[str, str] | None, Field(title="Owner Links")]
= None
is_favorite: Annotated[bool | None, Field(title="Is Favorite")] = False
@@ -1765,13 +1761,14 @@ class DAGDetailsResponse(BaseModel):
concurrency: Annotated[
int,
Field(
+ deprecated=True,
description="Return max_active_tasks as
concurrency.\n\nDeprecated: Use max_active_tasks instead.",
title="Concurrency",
),
]
latest_dag_version: Annotated[
DagVersionResponse | None, Field(description="Return the latest
DagVersion.")
- ] = None
+ ]
class DAGResponse(BaseModel):
@@ -1783,33 +1780,31 @@ class DAGResponse(BaseModel):
dag_display_name: Annotated[str, Field(title="Dag Display Name")]
is_paused: Annotated[bool, Field(title="Is Paused")]
is_stale: Annotated[bool, Field(title="Is Stale")]
- last_parsed_time: Annotated[datetime | None, Field(title="Last Parsed
Time")] = None
- last_parse_duration: Annotated[float | None, Field(title="Last Parse
Duration")] = None
- last_expired: Annotated[datetime | None, Field(title="Last Expired")] =
None
- bundle_name: Annotated[str | None, Field(title="Bundle Name")] = None
- bundle_version: Annotated[str | None, Field(title="Bundle Version")] = None
- relative_fileloc: Annotated[str | None, Field(title="Relative Fileloc")] =
None
+ last_parsed_time: Annotated[datetime | None, Field(title="Last Parsed
Time")]
+ last_parse_duration: Annotated[float | None, Field(title="Last Parse
Duration")]
+ last_expired: Annotated[datetime | None, Field(title="Last Expired")]
+ bundle_name: Annotated[str | None, Field(title="Bundle Name")]
+ bundle_version: Annotated[str | None, Field(title="Bundle Version")]
+ relative_fileloc: Annotated[str | None, Field(title="Relative Fileloc")]
fileloc: Annotated[str, Field(title="Fileloc")]
- description: Annotated[str | None, Field(title="Description")] = None
- timetable_summary: Annotated[str | None, Field(title="Timetable Summary")]
= None
- timetable_description: Annotated[str | None, Field(title="Timetable
Description")] = None
+ description: Annotated[str | None, Field(title="Description")]
+ timetable_summary: Annotated[str | None, Field(title="Timetable Summary")]
+ timetable_description: Annotated[str | None, Field(title="Timetable
Description")]
timetable_partitioned: Annotated[bool, Field(title="Timetable
Partitioned")]
timetable_periodic: Annotated[bool, Field(title="Timetable Periodic")]
tags: Annotated[list[DagTagResponse], Field(title="Tags")]
max_active_tasks: Annotated[int, Field(title="Max Active Tasks")]
- max_active_runs: Annotated[int | None, Field(title="Max Active Runs")] =
None
+ max_active_runs: Annotated[int | None, Field(title="Max Active Runs")]
max_consecutive_failed_dag_runs: Annotated[int, Field(title="Max
Consecutive Failed Dag Runs")]
has_task_concurrency_limits: Annotated[bool, Field(title="Has Task
Concurrency Limits")]
has_import_errors: Annotated[bool, Field(title="Has Import Errors")]
- next_dagrun_logical_date: Annotated[datetime | None, Field(title="Next
Dagrun Logical Date")] = None
+ next_dagrun_logical_date: Annotated[datetime | None, Field(title="Next
Dagrun Logical Date")]
next_dagrun_data_interval_start: Annotated[
datetime | None, Field(title="Next Dagrun Data Interval Start")
- ] = None
- next_dagrun_data_interval_end: Annotated[
- datetime | None, Field(title="Next Dagrun Data Interval End")
- ] = None
- next_dagrun_run_after: Annotated[datetime | None, Field(title="Next Dagrun
Run After")] = None
- allowed_run_types: Annotated[list[DagRunType] | None, Field(title="Allowed
Run Types")] = None
+ ]
+ next_dagrun_data_interval_end: Annotated[datetime | None,
Field(title="Next Dagrun Data Interval End")]
+ next_dagrun_run_after: Annotated[datetime | None, Field(title="Next Dagrun
Run After")]
+ allowed_run_types: Annotated[list[DagRunType] | None, Field(title="Allowed
Run Types")]
owners: Annotated[list[str], Field(title="Owners")]
is_backfillable: Annotated[
bool, Field(description="Whether this Dag's schedule supports
backfilling.", title="Is Backfillable")
@@ -1836,26 +1831,26 @@ class DAGRunResponse(BaseModel):
dag_run_id: Annotated[str, Field(title="Dag Run Id")]
dag_id: Annotated[str, Field(title="Dag Id")]
- logical_date: Annotated[datetime | None, Field(title="Logical Date")] =
None
- queued_at: Annotated[datetime | None, Field(title="Queued At")] = None
- start_date: Annotated[datetime | None, Field(title="Start Date")] = None
- end_date: Annotated[datetime | None, Field(title="End Date")] = None
- duration: Annotated[float | None, Field(title="Duration")] = None
- data_interval_start: Annotated[datetime | None, Field(title="Data Interval
Start")] = None
- data_interval_end: Annotated[datetime | None, Field(title="Data Interval
End")] = None
+ logical_date: Annotated[datetime | None, Field(title="Logical Date")]
+ queued_at: Annotated[datetime | None, Field(title="Queued At")]
+ start_date: Annotated[datetime | None, Field(title="Start Date")]
+ end_date: Annotated[datetime | None, Field(title="End Date")]
+ duration: Annotated[float | None, Field(title="Duration")]
+ data_interval_start: Annotated[datetime | None, Field(title="Data Interval
Start")]
+ data_interval_end: Annotated[datetime | None, Field(title="Data Interval
End")]
run_after: Annotated[datetime, Field(title="Run After")]
- last_scheduling_decision: Annotated[datetime | None, Field(title="Last
Scheduling Decision")] = None
+ last_scheduling_decision: Annotated[datetime | None, Field(title="Last
Scheduling Decision")]
run_type: DagRunType
state: DagRunState
- triggered_by: DagRunTriggeredByType | None = None
- triggering_user_name: Annotated[str | None, Field(title="Triggering User
Name")] = None
- conf: Annotated[dict[str, Any] | None, Field(title="Conf")] = None
- note: Annotated[str | None, Field(title="Note")] = None
+ triggered_by: DagRunTriggeredByType | None
+ triggering_user_name: Annotated[str | None, Field(title="Triggering User
Name")]
+ conf: Annotated[dict[str, Any] | None, Field(title="Conf")]
+ note: Annotated[str | None, Field(title="Note")]
dag_versions: Annotated[list[DagVersionResponse], Field(title="Dag
Versions")]
- bundle_version: Annotated[str | None, Field(title="Bundle Version")] = None
+ bundle_version: Annotated[str | None, Field(title="Bundle Version")]
dag_display_name: Annotated[str, Field(title="Dag Display Name")]
- partition_key: Annotated[str | None, Field(title="Partition Key")] = None
- partition_date: Annotated[datetime | None, Field(title="Partition Date")]
= None
+ partition_key: Annotated[str | None, Field(title="Partition Key")]
+ partition_date: Annotated[datetime | None, Field(title="Partition Date")]
class DAGRunsBatchBody(BaseModel):
@@ -2033,7 +2028,9 @@ class PluginResponse(BaseModel):
]
react_apps: Annotated[list[ReactAppResponse], Field(title="React Apps")]
appbuilder_views: Annotated[list[AppBuilderViewResponse],
Field(title="Appbuilder Views")]
- appbuilder_menu_items: Annotated[list[AppBuilderMenuItemResponse],
Field(title="Appbuilder Menu Items")]
+ appbuilder_menu_items: Annotated[
+ list[AppBuilderMenuItemResponse], Field(deprecated=True,
title="Appbuilder Menu Items")
+ ]
global_operator_extra_links: Annotated[list[str], Field(title="Global
Operator Extra Links")]
operator_extra_links: Annotated[list[str], Field(title="Operator Extra
Links")]
source: Annotated[str, Field(title="Source")]
@@ -2085,28 +2082,28 @@ class TaskInstanceHistoryResponse(BaseModel):
dag_id: Annotated[str, Field(title="Dag Id")]
dag_run_id: Annotated[str, Field(title="Dag Run Id")]
map_index: Annotated[int, Field(title="Map Index")]
- start_date: Annotated[datetime | None, Field(title="Start Date")] = None
- end_date: Annotated[datetime | None, Field(title="End Date")] = None
- duration: Annotated[float | None, Field(title="Duration")] = None
- state: TaskInstanceState | None = None
+ start_date: Annotated[datetime | None, Field(title="Start Date")]
+ end_date: Annotated[datetime | None, Field(title="End Date")]
+ duration: Annotated[float | None, Field(title="Duration")]
+ state: TaskInstanceState | None
try_number: Annotated[int, Field(title="Try Number")]
max_tries: Annotated[int, Field(title="Max Tries")]
task_display_name: Annotated[str, Field(title="Task Display Name")]
dag_display_name: Annotated[str, Field(title="Dag Display Name")]
- hostname: Annotated[str | None, Field(title="Hostname")] = None
- unixname: Annotated[str | None, Field(title="Unixname")] = None
+ hostname: Annotated[str | None, Field(title="Hostname")]
+ unixname: Annotated[str | None, Field(title="Unixname")]
pool: Annotated[str, Field(title="Pool")]
pool_slots: Annotated[int, Field(title="Pool Slots")]
- queue: Annotated[str | None, Field(title="Queue")] = None
- priority_weight: Annotated[int | None, Field(title="Priority Weight")] =
None
- operator: Annotated[str | None, Field(title="Operator")] = None
- operator_name: Annotated[str | None, Field(title="Operator Name")] = None
- queued_when: Annotated[datetime | None, Field(title="Queued When")] = None
- scheduled_when: Annotated[datetime | None, Field(title="Scheduled When")]
= None
- pid: Annotated[int | None, Field(title="Pid")] = None
- executor: Annotated[str | None, Field(title="Executor")] = None
+ queue: Annotated[str | None, Field(title="Queue")]
+ priority_weight: Annotated[int | None, Field(title="Priority Weight")]
+ operator: Annotated[str | None, Field(title="Operator")]
+ operator_name: Annotated[str | None, Field(title="Operator Name")]
+ queued_when: Annotated[datetime | None, Field(title="Queued When")]
+ scheduled_when: Annotated[datetime | None, Field(title="Scheduled When")]
+ pid: Annotated[int | None, Field(title="Pid")]
+ executor: Annotated[str | None, Field(title="Executor")]
executor_config: Annotated[str, Field(title="Executor Config")]
- dag_version: DagVersionResponse | None = None
+ dag_version: DagVersionResponse | None
class TaskInstanceResponse(BaseModel):
@@ -2119,35 +2116,35 @@ class TaskInstanceResponse(BaseModel):
dag_id: Annotated[str, Field(title="Dag Id")]
dag_run_id: Annotated[str, Field(title="Dag Run Id")]
map_index: Annotated[int, Field(title="Map Index")]
- logical_date: Annotated[datetime | None, Field(title="Logical Date")] =
None
+ logical_date: Annotated[datetime | None, Field(title="Logical Date")]
run_after: Annotated[datetime, Field(title="Run After")]
- start_date: Annotated[datetime | None, Field(title="Start Date")] = None
- end_date: Annotated[datetime | None, Field(title="End Date")] = None
- duration: Annotated[float | None, Field(title="Duration")] = None
- state: TaskInstanceState | None = None
+ start_date: Annotated[datetime | None, Field(title="Start Date")]
+ end_date: Annotated[datetime | None, Field(title="End Date")]
+ duration: Annotated[float | None, Field(title="Duration")]
+ state: TaskInstanceState | None
try_number: Annotated[int, Field(title="Try Number")]
max_tries: Annotated[int, Field(title="Max Tries")]
task_display_name: Annotated[str, Field(title="Task Display Name")]
dag_display_name: Annotated[str, Field(title="Dag Display Name")]
- hostname: Annotated[str | None, Field(title="Hostname")] = None
- unixname: Annotated[str | None, Field(title="Unixname")] = None
+ hostname: Annotated[str | None, Field(title="Hostname")]
+ unixname: Annotated[str | None, Field(title="Unixname")]
pool: Annotated[str, Field(title="Pool")]
pool_slots: Annotated[int, Field(title="Pool Slots")]
- queue: Annotated[str | None, Field(title="Queue")] = None
- priority_weight: Annotated[int | None, Field(title="Priority Weight")] =
None
- operator: Annotated[str | None, Field(title="Operator")] = None
- operator_name: Annotated[str | None, Field(title="Operator Name")] = None
- queued_when: Annotated[datetime | None, Field(title="Queued When")] = None
- scheduled_when: Annotated[datetime | None, Field(title="Scheduled When")]
= None
- pid: Annotated[int | None, Field(title="Pid")] = None
- executor: Annotated[str | None, Field(title="Executor")] = None
+ queue: Annotated[str | None, Field(title="Queue")]
+ priority_weight: Annotated[int | None, Field(title="Priority Weight")]
+ operator: Annotated[str | None, Field(title="Operator")]
+ operator_name: Annotated[str | None, Field(title="Operator Name")]
+ queued_when: Annotated[datetime | None, Field(title="Queued When")]
+ scheduled_when: Annotated[datetime | None, Field(title="Scheduled When")]
+ pid: Annotated[int | None, Field(title="Pid")]
+ executor: Annotated[str | None, Field(title="Executor")]
executor_config: Annotated[str, Field(title="Executor Config")]
- note: Annotated[str | None, Field(title="Note")] = None
- rendered_map_index: Annotated[str | None, Field(title="Rendered Map
Index")] = None
+ note: Annotated[str | None, Field(title="Note")]
+ rendered_map_index: Annotated[str | None, Field(title="Rendered Map
Index")]
rendered_fields: Annotated[dict[str, Any] | None, Field(title="Rendered
Fields")] = None
- trigger: TriggerResponse | None = None
- triggerer_job: JobResponse | None = None
- dag_version: DagVersionResponse | None = None
+ trigger: TriggerResponse | None
+ triggerer_job: JobResponse | None
+ dag_version: DagVersionResponse | None
class TaskResponse(BaseModel):
@@ -2155,32 +2152,32 @@ class TaskResponse(BaseModel):
Task serializer for responses.
"""
- task_id: Annotated[str | None, Field(title="Task Id")] = None
- task_display_name: Annotated[str | None, Field(title="Task Display Name")]
= None
- owner: Annotated[str | None, Field(title="Owner")] = None
- start_date: Annotated[datetime | None, Field(title="Start Date")] = None
- end_date: Annotated[datetime | None, Field(title="End Date")] = None
- trigger_rule: Annotated[str | None, Field(title="Trigger Rule")] = None
+ task_id: Annotated[str | None, Field(title="Task Id")]
+ task_display_name: Annotated[str | None, Field(title="Task Display Name")]
+ owner: Annotated[str | None, Field(title="Owner")]
+ start_date: Annotated[datetime | None, Field(title="Start Date")]
+ end_date: Annotated[datetime | None, Field(title="End Date")]
+ trigger_rule: Annotated[str | None, Field(title="Trigger Rule")]
depends_on_past: Annotated[bool, Field(title="Depends On Past")]
wait_for_downstream: Annotated[bool, Field(title="Wait For Downstream")]
- retries: Annotated[float | None, Field(title="Retries")] = None
- queue: Annotated[str | None, Field(title="Queue")] = None
- pool: Annotated[str | None, Field(title="Pool")] = None
- pool_slots: Annotated[float | None, Field(title="Pool Slots")] = None
- execution_timeout: TimeDelta | None = None
- retry_delay: TimeDelta | None = None
+ retries: Annotated[float | None, Field(title="Retries")]
+ queue: Annotated[str | None, Field(title="Queue")]
+ pool: Annotated[str | None, Field(title="Pool")]
+ pool_slots: Annotated[float | None, Field(title="Pool Slots")]
+ execution_timeout: TimeDelta | None
+ retry_delay: TimeDelta | None
retry_exponential_backoff: Annotated[float, Field(title="Retry Exponential
Backoff")]
- priority_weight: Annotated[float | None, Field(title="Priority Weight")] =
None
- weight_rule: Annotated[str | None, Field(title="Weight Rule")] = None
- ui_color: Annotated[str | None, Field(title="Ui Color")] = None
- ui_fgcolor: Annotated[str | None, Field(title="Ui Fgcolor")] = None
- template_fields: Annotated[list[str] | None, Field(title="Template
Fields")] = None
- downstream_task_ids: Annotated[list[str] | None, Field(title="Downstream
Task Ids")] = None
- doc_md: Annotated[str | None, Field(title="Doc Md")] = None
- operator_name: Annotated[str | None, Field(title="Operator Name")] = None
- params: Annotated[dict[str, Any] | None, Field(title="Params")] = None
- class_ref: Annotated[dict[str, Any] | None, Field(title="Class Ref")] =
None
- is_mapped: Annotated[bool | None, Field(title="Is Mapped")] = None
+ priority_weight: Annotated[float | None, Field(title="Priority Weight")]
+ weight_rule: Annotated[str | None, Field(title="Weight Rule")]
+ ui_color: Annotated[str | None, Field(title="Ui Color")]
+ ui_fgcolor: Annotated[str | None, Field(title="Ui Fgcolor")]
+ template_fields: Annotated[list[str] | None, Field(title="Template
Fields")]
+ downstream_task_ids: Annotated[list[str] | None, Field(title="Downstream
Task Ids")]
+ doc_md: Annotated[str | None, Field(title="Doc Md")]
+ operator_name: Annotated[str | None, Field(title="Operator Name")]
+ params: Annotated[dict[str, Any] | None, Field(title="Params")]
+ class_ref: Annotated[dict[str, Any] | None, Field(title="Class Ref")]
+ is_mapped: Annotated[bool | None, Field(title="Is Mapped")]
extra_links: Annotated[
list[str], Field(description="Extract and return extra_links.",
title="Extra Links")
]
diff --git a/airflow-ctl/tests/airflow_ctl/api/test_operations.py
b/airflow-ctl/tests/airflow_ctl/api/test_operations.py
index cf61ed5dafa..b57883f7c42 100644
--- a/airflow-ctl/tests/airflow_ctl/api/test_operations.py
+++ b/airflow-ctl/tests/airflow_ctl/api/test_operations.py
@@ -278,6 +278,11 @@ class TestAssetsOperations:
)
dag_run_response = DAGRunResponse(
+ duration=None,
+ triggering_user_name=None,
+ bundle_version=None,
+ partition_key=None,
+ partition_date=None,
dag_display_name=dag_id,
dag_run_id=dag_id,
dag_id=dag_id,
@@ -296,6 +301,7 @@ class TestAssetsOperations:
note=None,
dag_versions=[
DagVersionResponse(
+ bundle_url=None,
id=uuid.uuid4(),
version_number=1,
dag_id=dag_id,
@@ -655,15 +661,17 @@ class TestConnectionsOperations:
)
connection_response = ConnectionResponse(
+ description=None,
+ team_name=None,
connection_id=connection_id,
conn_type=conn_type,
host=host,
- schema_=schema_,
+ schema=schema_,
login=login,
password=password,
port=port,
extra=extra,
- )
+ ) # type: ignore[call-arg]
connections_response = ConnectionCollectionResponse(
connections=[connection_response],
@@ -689,7 +697,9 @@ class TestConnectionsOperations:
def test_get(self):
def handle_request(request: httpx.Request) -> httpx.Response:
assert request.url.path ==
f"/api/v2/connections/{self.connection_id}"
- return httpx.Response(200,
json=json.loads(self.connection_response.model_dump_json()))
+ return httpx.Response(
+ 200,
json=json.loads(self.connection_response.model_dump_json(by_alias=True))
+ )
client = make_api_client(transport=httpx.MockTransport(handle_request))
response = client.connections.get(self.connection_id)
@@ -698,7 +708,9 @@ class TestConnectionsOperations:
def test_list(self):
def handle_request(request: httpx.Request) -> httpx.Response:
assert request.url.path == "/api/v2/connections"
- return httpx.Response(200,
json=json.loads(self.connections_response.model_dump_json()))
+ return httpx.Response(
+ 200,
json=json.loads(self.connections_response.model_dump_json(by_alias=True))
+ )
client = make_api_client(transport=httpx.MockTransport(handle_request))
response = client.connections.list()
@@ -707,7 +719,9 @@ class TestConnectionsOperations:
def test_create(self):
def handle_request(request: httpx.Request) -> httpx.Response:
assert request.url.path == "/api/v2/connections"
- return httpx.Response(200,
json=json.loads(self.connection_response.model_dump_json()))
+ return httpx.Response(
+ 200,
json=json.loads(self.connection_response.model_dump_json(by_alias=True))
+ )
client = make_api_client(transport=httpx.MockTransport(handle_request))
response = client.connections.create(connection=self.connection)
@@ -729,7 +743,9 @@ class TestConnectionsOperations:
"schema": self.schema_,
}
assert "schema_" not in request_body
- return httpx.Response(200,
json=json.loads(self.connection_response.model_dump_json()))
+ return httpx.Response(
+ 200,
json=json.loads(self.connection_response.model_dump_json(by_alias=True))
+ )
client = make_api_client(transport=httpx.MockTransport(handle_request))
response = client.connections.create(connection=connection)
@@ -775,7 +791,9 @@ class TestConnectionsOperations:
def test_delete(self):
def handle_request(request: httpx.Request) -> httpx.Response:
assert request.url.path ==
f"/api/v2/connections/{self.connection_id}"
- return httpx.Response(200,
json=json.loads(self.connection_response.model_dump_json()))
+ return httpx.Response(
+ 200,
json=json.loads(self.connection_response.model_dump_json(by_alias=True))
+ )
client = make_api_client(transport=httpx.MockTransport(handle_request))
response = client.connections.delete(self.connection_id)
@@ -784,7 +802,9 @@ class TestConnectionsOperations:
def test_update(self):
def handle_request(request: httpx.Request) -> httpx.Response:
assert request.url.path ==
f"/api/v2/connections/{self.connection_id}"
- return httpx.Response(200,
json=json.loads(self.connection_response.model_dump_json()))
+ return httpx.Response(
+ 200,
json=json.loads(self.connection_response.model_dump_json(by_alias=True))
+ )
client = make_api_client(transport=httpx.MockTransport(handle_request))
response = client.connections.update(connection=self.connection)
@@ -813,7 +833,9 @@ class TestConnectionsOperations:
"team_name": None,
}
assert "schema_" not in request_body
- return httpx.Response(200,
json=json.loads(self.connection_response.model_dump_json()))
+ return httpx.Response(
+ 200,
json=json.loads(self.connection_response.model_dump_json(by_alias=True))
+ )
client = make_api_client(transport=httpx.MockTransport(handle_request))
response = client.connections.update(connection=connection)
@@ -871,6 +893,9 @@ class TestDagOperations:
dag_id = "dag_id"
dag_display_name = "dag_display_name"
dag_response = DAGResponse(
+ last_parse_duration=None,
+ bundle_version=None,
+ allowed_run_types=None,
dag_id=dag_id,
dag_display_name=dag_display_name,
is_paused=False,
@@ -901,6 +926,11 @@ class TestDagOperations:
)
dag_details_response = DAGDetailsResponse(
+ last_parse_duration=None,
+ bundle_version=None,
+ allowed_run_types=None,
+ default_args=None,
+ latest_dag_version=None,
dag_id=dag_id,
dag_display_name="dag_display_name",
is_paused=False,
@@ -978,6 +1008,7 @@ class TestDagOperations:
)
dag_version_response = DagVersionResponse(
+ bundle_url=None,
id=uuid.uuid4(),
version_number=1,
dag_id=dag_id,
@@ -1011,6 +1042,7 @@ class TestDagOperations:
# DagRun related
trigger_dag_run = TriggerDAGRunPostBody(
+ logical_date=None,
conf=None,
note=None,
)
@@ -1018,6 +1050,11 @@ class TestDagOperations:
dag_id = "dag_id"
dag_run_id = "dag_run_id"
dag_run_response = DAGRunResponse(
+ duration=None,
+ triggering_user_name=None,
+ bundle_version=None,
+ partition_key=None,
+ partition_date=None,
dag_display_name=dag_run_id,
dag_run_id=dag_run_id,
dag_id=dag_id,
@@ -1036,6 +1073,7 @@ class TestDagOperations:
note=None,
dag_versions=[
DagVersionResponse(
+ bundle_url=None,
id=uuid.uuid4(),
version_number=1,
dag_id=dag_id,
@@ -1175,6 +1213,11 @@ class TestDagRunOperations:
dag_id = "dag_id"
dag_run_id = "dag_run_id"
dag_run_response = DAGRunResponse(
+ duration=None,
+ triggering_user_name=None,
+ bundle_version=None,
+ partition_key=None,
+ partition_date=None,
dag_display_name=dag_run_id,
dag_run_id=dag_run_id,
dag_id=dag_id,
@@ -1193,6 +1236,7 @@ class TestDagRunOperations:
note=None,
dag_versions=[
DagVersionResponse(
+ bundle_url=None,
id=uuid.uuid4(),
version_number=1,
dag_id=dag_id,
@@ -1387,6 +1431,7 @@ class TestPoolsOperations:
]
)
pool_response = PoolResponse(
+ team_name=None,
name=pool_name,
slots=1,
description="description",
@@ -1456,6 +1501,7 @@ class TestPoolsOperations:
class TestProvidersOperations:
provider_response = ProviderResponse(
+ documentation_url=None,
package_name="package_name",
version="version",
description="description",
@@ -1487,6 +1533,7 @@ class TestVariablesOperations:
}
)
variable_response = VariableResponse(
+ team_name=None,
key=key,
value=value,
description=description,
diff --git
a/airflow-ctl/tests/airflow_ctl/ctl/commands/test_connections_command.py
b/airflow-ctl/tests/airflow_ctl/ctl/commands/test_connections_command.py
index ba803ddd8e0..452d6182e7d 100644
--- a/airflow-ctl/tests/airflow_ctl/ctl/commands/test_connections_command.py
+++ b/airflow-ctl/tests/airflow_ctl/ctl/commands/test_connections_command.py
@@ -51,7 +51,9 @@ class TestCliConnectionCommands:
port=1234,
extra="{}",
description="Test connection description",
- )
+ schema=None,
+ team_name=None,
+ ) # type: ignore[call-arg]
],
total_entries=1,
)
diff --git a/airflow-ctl/tests/airflow_ctl/ctl/commands/test_dag_command.py
b/airflow-ctl/tests/airflow_ctl/ctl/commands/test_dag_command.py
index 405eb030065..9dfc38082a5 100644
--- a/airflow-ctl/tests/airflow_ctl/ctl/commands/test_dag_command.py
+++ b/airflow-ctl/tests/airflow_ctl/ctl/commands/test_dag_command.py
@@ -58,6 +58,9 @@ class TestDagCommands:
file_token="file_token",
bundle_name="bundle_name",
is_stale=False,
+ last_parse_duration=None,
+ bundle_version=None,
+ allowed_run_types=None,
)
dag_response_unpaused = DAGResponse(
@@ -88,6 +91,9 @@ class TestDagCommands:
file_token="file_token",
bundle_name="bundle_name",
is_stale=False,
+ last_parse_duration=None,
+ bundle_version=None,
+ allowed_run_types=None,
)
dag_response_no_schedule = DAGResponse(
@@ -118,6 +124,9 @@ class TestDagCommands:
file_token="file_token",
bundle_name="bundle_name",
is_stale=False,
+ last_parse_duration=None,
+ bundle_version=None,
+ allowed_run_types=None,
)
def test_pause_dag(self, api_client_maker, monkeypatch):
diff --git
a/airflow-ctl/tests/airflow_ctl/ctl/commands/test_variable_command.py
b/airflow-ctl/tests/airflow_ctl/ctl/commands/test_variable_command.py
index f573585935f..3e7b2714f94 100644
--- a/airflow-ctl/tests/airflow_ctl/ctl/commands/test_variable_command.py
+++ b/airflow-ctl/tests/airflow_ctl/ctl/commands/test_variable_command.py
@@ -41,10 +41,7 @@ class TestCliVariableCommands:
variable_collection_response = VariableCollectionResponse(
variables=[
VariableResponse(
- key=key,
- value=value,
- description=description,
- is_encrypted=False,
+ key=key, value=value, description=description,
is_encrypted=False, team_name=None
),
],
total_entries=1,
diff --git a/devel-common/src/tests_common/pytest_plugin.py
b/devel-common/src/tests_common/pytest_plugin.py
index 413723ec317..a27f7ee7846 100644
--- a/devel-common/src/tests_common/pytest_plugin.py
+++ b/devel-common/src/tests_common/pytest_plugin.py
@@ -2818,6 +2818,9 @@ def create_runtime_ti(mocked_parse):
"run_after": run_after, # type: ignore
"conf": conf,
"consumed_asset_events": [],
+ # Nullable-but-required in the generated schema, so they
must be
+ # passed explicitly; guarded for older Task SDKs that lack
them.
+ **{f: None for f in ("end_date", "partition_key") if f in
DagRun.model_fields},
**({"state": DagRunState.RUNNING} if "state" in
DagRun.model_fields else {}),
}
),
diff --git a/providers/amazon/tests/unit/amazon/aws/hooks/test_base_aws.py
b/providers/amazon/tests/unit/amazon/aws/hooks/test_base_aws.py
index e0984f88e24..be68d99af99 100644
--- a/providers/amazon/tests/unit/amazon/aws/hooks/test_base_aws.py
+++ b/providers/amazon/tests/unit/amazon/aws/hooks/test_base_aws.py
@@ -467,6 +467,12 @@ class TestAwsBaseHook:
mock_supervisor_comms.send.return_value = ConnectionResult(
conn_id="aws_default",
conn_type="aws",
+ host=None,
+ schema=None,
+ login=None,
+ password=None,
+ port=None,
+ extra=None,
)
with mock.patch.dict(os.environ, env_var, clear=True):
dag_run_key = self.fetch_tags()["DagRunKey"]
diff --git
a/providers/openlineage/tests/unit/openlineage/plugins/test_listener.py
b/providers/openlineage/tests/unit/openlineage/plugins/test_listener.py
index edec29202c0..b44e90b4958 100644
--- a/providers/openlineage/tests/unit/openlineage/plugins/test_listener.py
+++ b/providers/openlineage/tests/unit/openlineage/plugins/test_listener.py
@@ -1289,9 +1289,17 @@ class TestOpenLineageListenerAirflow3:
"run_type": DagRunType.MANUAL,
"run_after": timezone.datetime(2023, 1, 3, 13, 1,
1),
"consumed_asset_events": [],
- **(
- {"state": SdkDagRunState.RUNNING} if "state"
in SdkDagRun.model_fields else {}
- ),
+ # Nullable-but-required on newer SDKs, absent on
older ones.
+ **{
+ field: value
+ for field, value in (
+ ("state", SdkDagRunState.RUNNING),
+ ("data_interval_start", None),
+ ("data_interval_end", None),
+ ("partition_key", None),
+ )
+ if field in SdkDagRun.model_fields
+ },
}
),
task_reschedule_count=0,
diff --git a/task-sdk/pyproject.toml b/task-sdk/pyproject.toml
index caecd570700..2810a0f836c 100644
--- a/task-sdk/pyproject.toml
+++ b/task-sdk/pyproject.toml
@@ -215,7 +215,7 @@ exclude_also = [
[dependency-groups]
codegen = [
- "datamodel-code-generator[http]==0.33.0",
+ "datamodel-code-generator[http]>=0.71.0",
"openapi-spec-validator>=0.7.1",
"svcs>=25.1.0",
"rich>=13.6.0",
diff --git a/task-sdk/src/airflow/sdk/api/datamodels/_generated.py
b/task-sdk/src/airflow/sdk/api/datamodels/_generated.py
index 80cee82cb1e..c625ba92a72 100644
--- a/task-sdk/src/airflow/sdk/api/datamodels/_generated.py
+++ b/task-sdk/src/airflow/sdk/api/datamodels/_generated.py
@@ -1,6 +1,6 @@
# generated by datamodel-codegen:
# filename: http://0.0.0.0:8080/execution/openapi.json
-# version: 0.33.0
+# version: 0.71.0
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
@@ -70,12 +70,12 @@ class ConnectionResponse(BaseModel):
conn_id: Annotated[str, Field(title="Conn Id")]
conn_type: Annotated[str, Field(title="Conn Type")]
- host: Annotated[str | None, Field(title="Host")] = None
- schema_: Annotated[str | None, Field(alias="schema", title="Schema")] =
None
- login: Annotated[str | None, Field(title="Login")] = None
- password: Annotated[str | None, Field(title="Password")] = None
- port: Annotated[int | None, Field(title="Port")] = None
- extra: Annotated[str | None, Field(title="Extra")] = None
+ host: Annotated[str | None, Field(title="Host")]
+ schema_: Annotated[str | None, Field(alias="schema", title="Schema")]
+ login: Annotated[str | None, Field(title="Login")]
+ password: Annotated[str | None, Field(title="Password")]
+ port: Annotated[int | None, Field(title="Port")]
+ extra: Annotated[str | None, Field(title="Extra")]
class ConnectionTestConnectionResponse(BaseModel):
@@ -116,12 +116,12 @@ class DagResponse(BaseModel):
dag_id: Annotated[str, Field(title="Dag Id")]
is_paused: Annotated[bool, Field(title="Is Paused")]
- bundle_name: Annotated[str | None, Field(title="Bundle Name")] = None
- bundle_version: Annotated[str | None, Field(title="Bundle Version")] = None
- relative_fileloc: Annotated[str | None, Field(title="Relative Fileloc")] =
None
- owners: Annotated[str | None, Field(title="Owners")] = None
+ bundle_name: Annotated[str | None, Field(title="Bundle Name")]
+ bundle_version: Annotated[str | None, Field(title="Bundle Version")]
+ relative_fileloc: Annotated[str | None, Field(title="Relative Fileloc")]
+ owners: Annotated[str | None, Field(title="Owners")]
tags: Annotated[list[str], Field(title="Tags")]
- next_dagrun: Annotated[AwareDatetime | None, Field(title="Next Dagrun")] =
None
+ next_dagrun: Annotated[AwareDatetime | None, Field(title="Next Dagrun")]
class DagRunAssetReference(BaseModel):
@@ -134,13 +134,13 @@ class DagRunAssetReference(BaseModel):
)
run_id: Annotated[str, Field(title="Run Id")]
dag_id: Annotated[str, Field(title="Dag Id")]
- logical_date: Annotated[AwareDatetime | None, Field(title="Logical Date")]
= None
+ logical_date: Annotated[AwareDatetime | None, Field(title="Logical Date")]
start_date: Annotated[AwareDatetime, Field(title="Start Date")]
- end_date: Annotated[AwareDatetime | None, Field(title="End Date")] = None
+ end_date: Annotated[AwareDatetime | None, Field(title="End Date")]
state: Annotated[str, Field(title="State")]
- data_interval_start: Annotated[AwareDatetime | None, Field(title="Data
Interval Start")] = None
- data_interval_end: Annotated[AwareDatetime | None, Field(title="Data
Interval End")] = None
- partition_key: Annotated[str | None, Field(title="Partition Key")] = None
+ data_interval_start: Annotated[AwareDatetime | None, Field(title="Data
Interval Start")]
+ data_interval_end: Annotated[AwareDatetime | None, Field(title="Data
Interval End")]
+ partition_key: Annotated[str | None, Field(title="Partition Key")]
class DagRunState(str, Enum):
@@ -254,10 +254,10 @@ class TIAwaitingInputStatePayload(BaseModel):
model_config = ConfigDict(
extra="forbid",
)
- state: Annotated[Literal["awaiting_input"] | None, Field(title="State")] =
"awaiting_input"
+ state: Annotated[Literal["awaiting_input"], Field(title="State")] =
"awaiting_input"
timeout: Annotated[timedelta | None, Field(title="Timeout")] = None
next_method: Annotated[str, Field(title="Next Method")]
- next_kwargs: Annotated[dict[str, JsonValue] | None, Field(title="Next
Kwargs")] = None
+ next_kwargs: Annotated[dict[str, JsonValue | None] | None,
Field(title="Next Kwargs")] = None
rendered_map_index: Annotated[str | None, Field(title="Rendered Map
Index")] = None
@@ -269,13 +269,13 @@ class TIDeferredStatePayload(BaseModel):
model_config = ConfigDict(
extra="forbid",
)
- state: Annotated[Literal["deferred"] | None, Field(title="State")] =
"deferred"
+ state: Annotated[Literal["deferred"], Field(title="State")] = "deferred"
classpath: Annotated[str, Field(title="Classpath")]
- trigger_kwargs: Annotated[dict[str, JsonValue] | str | None,
Field(title="Trigger Kwargs")] = None
+ trigger_kwargs: Annotated[dict[str, JsonValue | None] | str | None,
Field(title="Trigger Kwargs")] = None
trigger_timeout: Annotated[timedelta | None, Field(title="Trigger
Timeout")] = None
queue: Annotated[str | None, Field(title="Queue")] = None
next_method: Annotated[str, Field(title="Next Method")]
- next_kwargs: Annotated[dict[str, JsonValue] | None, Field(title="Next
Kwargs")] = None
+ next_kwargs: Annotated[dict[str, JsonValue | None] | None,
Field(title="Next Kwargs")] = None
rendered_map_index: Annotated[str | None, Field(title="Rendered Map
Index")] = None
@@ -287,7 +287,7 @@ class TIEnterRunningPayload(BaseModel):
model_config = ConfigDict(
extra="forbid",
)
- state: Annotated[Literal["running"] | None, Field(title="State")] =
"running"
+ state: Annotated[Literal["running"], Field(title="State")] = "running"
hostname: Annotated[str, Field(title="Hostname")]
unixname: Annotated[str, Field(title="Unixname")]
pid: Annotated[int, Field(title="Pid")]
@@ -314,7 +314,7 @@ class TIRescheduleStatePayload(BaseModel):
model_config = ConfigDict(
extra="forbid",
)
- state: Annotated[Literal["up_for_reschedule"] | None,
Field(title="State")] = "up_for_reschedule"
+ state: Annotated[Literal["up_for_reschedule"], Field(title="State")] =
"up_for_reschedule"
reschedule_date: Annotated[AwareDatetime, Field(title="Reschedule Date")]
end_date: Annotated[AwareDatetime, Field(title="End Date")]
@@ -327,7 +327,7 @@ class TIRetryStatePayload(BaseModel):
model_config = ConfigDict(
extra="forbid",
)
- state: Annotated[Literal["up_for_retry"] | None, Field(title="State")] =
"up_for_retry"
+ state: Annotated[Literal["up_for_retry"], Field(title="State")] =
"up_for_retry"
end_date: Annotated[AwareDatetime, Field(title="End Date")]
rendered_map_index: Annotated[str | None, Field(title="Rendered Map
Index")] = None
retry_delay_seconds: Annotated[float | None, Field(title="Retry Delay
Seconds")] = None
@@ -353,7 +353,7 @@ class TISuccessStatePayload(BaseModel):
model_config = ConfigDict(
extra="forbid",
)
- state: Annotated[Literal["success"] | None, Field(title="State")] =
"success"
+ state: Annotated[Literal["success"], Field(title="State")] = "success"
end_date: Annotated[AwareDatetime, Field(title="End Date")]
task_outlets: Annotated[list[AssetProfile] | None, Field(title="Task
Outlets")] = None
outlet_events: Annotated[list[dict[str, Any]] | None, Field(title="Outlet
Events")] = None
@@ -409,7 +409,7 @@ class TaskStateStorePutBody(BaseModel):
model_config = ConfigDict(
extra="forbid",
)
- value: JsonValue
+ value: JsonValue | None
expires_at: Annotated[AwareDatetime | None, Field(title="Expires At")] =
None
@@ -421,7 +421,7 @@ class TaskStateStoreResponse(BaseModel):
model_config = ConfigDict(
extra="forbid",
)
- value: JsonValue
+ value: JsonValue | None
class TaskStatesResponse(BaseModel):
@@ -497,7 +497,7 @@ class VariablePostBody(BaseModel):
model_config = ConfigDict(
extra="forbid",
)
- val: Annotated[str | None, Field(title="Val")] = None
+ val: Annotated[str | None, Field(title="Val")]
description: Annotated[str | None, Field(title="Description")] = None
@@ -510,7 +510,7 @@ class VariableResponse(BaseModel):
extra="forbid",
)
key: Annotated[str, Field(title="Key")]
- value: Annotated[str | None, Field(title="Value")] = None
+ value: Annotated[str | None, Field(title="Value")]
class XComResponse(BaseModel):
@@ -519,12 +519,12 @@ class XComResponse(BaseModel):
"""
key: Annotated[str, Field(title="Key")]
- value: JsonValue
+ value: JsonValue | None
-class XComSequenceIndexResponse(RootModel[JsonValue]):
+class XComSequenceIndexResponse(RootModel[JsonValue | None]):
root: Annotated[
- JsonValue,
+ JsonValue | None,
Field(
description="XCom schema with minimal structure for index-based
access.",
title="XComSequenceIndexResponse",
@@ -532,13 +532,13 @@ class XComSequenceIndexResponse(RootModel[JsonValue]):
]
-class XComSequenceSliceResponse(RootModel[list[JsonValue]]):
+class XComSequenceSliceResponse(RootModel[list[JsonValue | None]]):
"""
XCom schema with minimal structure for slice-based access.
"""
root: Annotated[
- list[JsonValue],
+ list[JsonValue | None],
Field(
description="XCom schema with minimal structure for slice-based
access.",
title="XComSequenceSliceResponse",
@@ -617,7 +617,7 @@ class AssetReferenceAssetEventDagRun(BaseModel):
)
name: Annotated[str, Field(title="Name")]
uri: Annotated[str, Field(title="Uri")]
- extra: Annotated[dict[str, JsonValue], Field(title="Extra")]
+ extra: Annotated[dict[str, JsonValue | None], Field(title="Extra")]
class AssetResponse(BaseModel):
@@ -628,7 +628,7 @@ class AssetResponse(BaseModel):
name: Annotated[str, Field(title="Name")]
uri: Annotated[str, Field(title="Uri")]
group: Annotated[str, Field(title="Group")]
- extra: Annotated[dict[str, JsonValue] | None, Field(title="Extra")] = None
+ extra: Annotated[dict[str, JsonValue | None] | None, Field(title="Extra")]
= None
class AssetStateStorePutBody(BaseModel):
@@ -639,7 +639,7 @@ class AssetStateStorePutBody(BaseModel):
model_config = ConfigDict(
extra="forbid",
)
- value: JsonValue
+ value: JsonValue | None
class AssetStateStoreResponse(BaseModel):
@@ -650,7 +650,7 @@ class AssetStateStoreResponse(BaseModel):
model_config = ConfigDict(
extra="forbid",
)
- value: JsonValue
+ value: JsonValue | None
class ConnectionTestResultBody(BaseModel):
@@ -687,8 +687,8 @@ class HITLDetailResponse(BaseModel):
response_received: Annotated[bool, Field(title="Response Received")]
responded_by_user: HITLUser | None = None
- responded_at: Annotated[AwareDatetime | None, Field(title="Responded At")]
= None
- chosen_options: Annotated[list[str] | None, Field(title="Chosen Options")]
= None
+ responded_at: Annotated[AwareDatetime | None, Field(title="Responded At")]
+ chosen_options: Annotated[list[str] | None, Field(title="Chosen Options")]
params_input: Annotated[dict[str, Any] | None, Field(title="Params
Input")] = None
@@ -718,11 +718,11 @@ class AssetEventDagRunReference(BaseModel):
extra="forbid",
)
asset: AssetReferenceAssetEventDagRun
- extra: Annotated[dict[str, JsonValue], Field(title="Extra")]
- source_task_id: Annotated[str | None, Field(title="Source Task Id")] = None
- source_dag_id: Annotated[str | None, Field(title="Source Dag Id")] = None
- source_run_id: Annotated[str | None, Field(title="Source Run Id")] = None
- source_map_index: Annotated[int | None, Field(title="Source Map Index")] =
None
+ extra: Annotated[dict[str, JsonValue | None], Field(title="Extra")]
+ source_task_id: Annotated[str | None, Field(title="Source Task Id")]
+ source_dag_id: Annotated[str | None, Field(title="Source Dag Id")]
+ source_run_id: Annotated[str | None, Field(title="Source Run Id")]
+ source_map_index: Annotated[int | None, Field(title="Source Map Index")]
source_aliases: Annotated[list[AssetAliasReferenceAssetEventDagRun],
Field(title="Source Aliases")]
timestamp: Annotated[AwareDatetime, Field(title="Timestamp")]
partition_key: Annotated[str | None, Field(title="Partition Key")] = None
@@ -735,7 +735,7 @@ class AssetEventResponse(BaseModel):
id: Annotated[int, Field(title="Id")]
timestamp: Annotated[AwareDatetime, Field(title="Timestamp")]
- extra: Annotated[dict[str, JsonValue] | None, Field(title="Extra")] = None
+ extra: Annotated[dict[str, JsonValue | None] | None, Field(title="Extra")]
= None
asset: AssetResponse
created_dagruns: Annotated[list[DagRunAssetReference],
Field(title="Created Dagruns")]
source_task_id: Annotated[str | None, Field(title="Source Task Id")] = None
@@ -763,19 +763,19 @@ class DagRun(BaseModel):
)
dag_id: Annotated[str, Field(title="Dag Id")]
run_id: Annotated[str, Field(title="Run Id")]
- logical_date: Annotated[AwareDatetime | None, Field(title="Logical Date")]
= None
- data_interval_start: Annotated[AwareDatetime | None, Field(title="Data
Interval Start")] = None
- data_interval_end: Annotated[AwareDatetime | None, Field(title="Data
Interval End")] = None
+ logical_date: Annotated[AwareDatetime | None, Field(title="Logical Date")]
+ data_interval_start: Annotated[AwareDatetime | None, Field(title="Data
Interval Start")]
+ data_interval_end: Annotated[AwareDatetime | None, Field(title="Data
Interval End")]
run_after: Annotated[AwareDatetime, Field(title="Run After")]
- start_date: Annotated[AwareDatetime | None, Field(title="Start Date")] =
None
- end_date: Annotated[AwareDatetime | None, Field(title="End Date")] = None
+ start_date: Annotated[AwareDatetime | None, Field(title="Start Date")]
+ end_date: Annotated[AwareDatetime | None, Field(title="End Date")]
clear_number: Annotated[int | None, Field(title="Clear Number")] = 0
run_type: DagRunType
state: DagRunState
conf: Annotated[dict[str, Any] | None, Field(title="Conf")] = None
triggering_user_name: Annotated[str | None, Field(title="Triggering User
Name")] = None
consumed_asset_events: Annotated[list[AssetEventDagRunReference],
Field(title="Consumed Asset Events")]
- partition_key: Annotated[str | None, Field(title="Partition Key")] = None
+ partition_key: Annotated[str | None, Field(title="Partition Key")]
partition_date: Annotated[AwareDatetime | None, Field(title="Partition
Date")] = None
note: Annotated[str | None, Field(title="Note")] = None
team_name: Annotated[str | None, Field(title="Team Name")] = None
diff --git a/task-sdk/src/airflow/sdk/execution_time/schema/schema.json
b/task-sdk/src/airflow/sdk/execution_time/schema/schema.json
index 08383b14222..53efa708750 100644
--- a/task-sdk/src/airflow/sdk/execution_time/schema/schema.json
+++ b/task-sdk/src/airflow/sdk/execution_time/schema/schema.json
@@ -34,7 +34,14 @@
"anyOf": [
{
"additionalProperties": {
- "$ref": "#/$defs/JsonValue"
+ "anyOf": [
+ {
+ "$ref": "#/$defs/JsonValue"
+ },
+ {
+ "type": "null"
+ }
+ ]
},
"type": "object"
},
@@ -187,34 +194,6 @@
"title": "AssetProfile",
"type": "object"
},
- "AssetReferenceAssetEventDagRun": {
- "additionalProperties": false,
- "description": "Schema for AssetModel used in
AssetEventDagRunReference.",
- "properties": {
- "name": {
- "title": "Name",
- "type": "string"
- },
- "uri": {
- "title": "Uri",
- "type": "string"
- },
- "extra": {
- "additionalProperties": {
- "$ref": "#/$defs/JsonValue"
- },
- "title": "Extra",
- "type": "object"
- }
- },
- "required": [
- "name",
- "uri",
- "extra"
- ],
- "title": "AssetReferenceAssetEventDagRun",
- "type": "object"
- },
"AssetResponse": {
"description": "Asset schema for responses with fields that are needed
for Runtime.",
"properties": {
@@ -234,7 +213,14 @@
"anyOf": [
{
"additionalProperties": {
- "$ref": "#/$defs/JsonValue"
+ "anyOf": [
+ {
+ "$ref": "#/$defs/JsonValue"
+ },
+ {
+ "type": "null"
+ }
+ ]
},
"type": "object"
},
@@ -273,7 +259,14 @@
"anyOf": [
{
"additionalProperties": {
- "$ref": "#/$defs/JsonValue"
+ "anyOf": [
+ {
+ "$ref": "#/$defs/JsonValue"
+ },
+ {
+ "type": "null"
+ }
+ ]
},
"type": "object"
},
@@ -304,7 +297,14 @@
"description": "Response to GetAssetStateStore; wraps the generated API
response for supervisor to worker comms.",
"properties": {
"value": {
- "$ref": "#/$defs/JsonValue"
+ "anyOf": [
+ {
+ "$ref": "#/$defs/JsonValue"
+ },
+ {
+ "type": "null"
+ }
+ ]
},
"type": {
"const": "AssetStateStoreResult",
@@ -347,17 +347,10 @@
"description": "Park a task instance awaiting human input
(Human-in-the-loop), without a trigger.",
"properties": {
"state": {
- "anyOf": [
- {
- "const": "awaiting_input",
- "type": "string"
- },
- {
- "type": "null"
- }
- ],
+ "const": "awaiting_input",
"default": "awaiting_input",
- "title": "State"
+ "title": "State",
+ "type": "string"
},
"timeout": {
"anyOf": [
@@ -380,7 +373,14 @@
"anyOf": [
{
"additionalProperties": {
- "$ref": "#/$defs/JsonValue"
+ "anyOf": [
+ {
+ "$ref": "#/$defs/JsonValue"
+ },
+ {
+ "type": "null"
+ }
+ ]
},
"type": "object"
},
@@ -500,6 +500,97 @@
"title": "ClearTaskStateStore",
"type": "object"
},
+ "ConnectionResponse": {
+ "description": "Connection schema for responses with fields that are
needed for Runtime.",
+ "properties": {
+ "conn_id": {
+ "title": "Conn Id",
+ "type": "string"
+ },
+ "conn_type": {
+ "title": "Conn Type",
+ "type": "string"
+ },
+ "host": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Host"
+ },
+ "schema": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Schema"
+ },
+ "login": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Login"
+ },
+ "password": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Password"
+ },
+ "port": {
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Port"
+ },
+ "extra": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Extra"
+ }
+ },
+ "required": [
+ "conn_id",
+ "conn_type",
+ "host",
+ "schema",
+ "login",
+ "password",
+ "port",
+ "extra"
+ ],
+ "title": "ConnectionResponse",
+ "type": "object"
+ },
"ConnectionResult": {
"properties": {
"conn_id": {
@@ -519,7 +610,6 @@
"type": "null"
}
],
- "default": null,
"title": "Host"
},
"schema": {
@@ -531,7 +621,6 @@
"type": "null"
}
],
- "default": null,
"title": "Schema"
},
"login": {
@@ -543,7 +632,6 @@
"type": "null"
}
],
- "default": null,
"title": "Login"
},
"password": {
@@ -555,7 +643,6 @@
"type": "null"
}
],
- "default": null,
"title": "Password"
},
"port": {
@@ -567,7 +654,6 @@
"type": "null"
}
],
- "default": null,
"title": "Port"
},
"extra": {
@@ -579,7 +665,6 @@
"type": "null"
}
],
- "default": null,
"title": "Extra"
},
"type": {
@@ -591,7 +676,13 @@
},
"required": [
"conn_id",
- "conn_type"
+ "conn_type",
+ "host",
+ "schema",
+ "login",
+ "password",
+ "port",
+ "extra"
],
"title": "ConnectionResult",
"type": "object"
@@ -931,7 +1022,6 @@
"type": "null"
}
],
- "default": null,
"title": "Bundle Name"
},
"bundle_version": {
@@ -943,7 +1033,6 @@
"type": "null"
}
],
- "default": null,
"title": "Bundle Version"
},
"relative_fileloc": {
@@ -955,7 +1044,6 @@
"type": "null"
}
],
- "default": null,
"title": "Relative Fileloc"
},
"owners": {
@@ -967,7 +1055,6 @@
"type": "null"
}
],
- "default": null,
"title": "Owners"
},
"tags": {
@@ -987,7 +1074,6 @@
"type": "null"
}
],
- "default": null,
"title": "Next Dagrun"
},
"type": {
@@ -1000,7 +1086,12 @@
"required": [
"dag_id",
"is_paused",
- "tags"
+ "bundle_name",
+ "bundle_version",
+ "relative_fileloc",
+ "owners",
+ "tags",
+ "next_dagrun"
],
"title": "DagResult",
"type": "object"
@@ -1027,7 +1118,6 @@
"type": "null"
}
],
- "default": null,
"title": "Logical Date"
},
"start_date": {
@@ -1045,7 +1135,6 @@
"type": "null"
}
],
- "default": null,
"title": "End Date"
},
"state": {
@@ -1062,7 +1151,6 @@
"type": "null"
}
],
- "default": null,
"title": "Data Interval Start"
},
"data_interval_end": {
@@ -1075,7 +1163,6 @@
"type": "null"
}
],
- "default": null,
"title": "Data Interval End"
},
"partition_key": {
@@ -1087,15 +1174,19 @@
"type": "null"
}
],
- "default": null,
"title": "Partition Key"
}
},
"required": [
"run_id",
"dag_id",
+ "logical_date",
"start_date",
- "state"
+ "end_date",
+ "state",
+ "data_interval_start",
+ "data_interval_end",
+ "partition_key"
],
"title": "DagRunAssetReference",
"type": "object"
@@ -1150,7 +1241,6 @@
"type": "null"
}
],
- "default": null,
"title": "Logical Date"
},
"data_interval_start": {
@@ -1163,7 +1253,6 @@
"type": "null"
}
],
- "default": null,
"title": "Data Interval Start"
},
"data_interval_end": {
@@ -1176,7 +1265,6 @@
"type": "null"
}
],
- "default": null,
"title": "Data Interval End"
},
"run_after": {
@@ -1194,7 +1282,6 @@
"type": "null"
}
],
- "default": null,
"title": "Start Date"
},
"end_date": {
@@ -1207,7 +1294,6 @@
"type": "null"
}
],
- "default": null,
"title": "End Date"
},
"clear_number": {
@@ -1269,7 +1355,6 @@
"type": "null"
}
],
- "default": null,
"title": "Partition Key"
},
"partition_date": {
@@ -1319,10 +1404,16 @@
"required": [
"dag_id",
"run_id",
+ "logical_date",
+ "data_interval_start",
+ "data_interval_end",
"run_after",
+ "start_date",
+ "end_date",
"run_type",
"state",
- "consumed_asset_events"
+ "consumed_asset_events",
+ "partition_key"
],
"title": "DagRunResult",
"type": "object"
@@ -1374,17 +1465,10 @@
"description": "Update a task instance state to deferred.",
"properties": {
"state": {
- "anyOf": [
- {
- "const": "deferred",
- "type": "string"
- },
- {
- "type": "null"
- }
- ],
+ "const": "deferred",
"default": "deferred",
- "title": "State"
+ "title": "State",
+ "type": "string"
},
"classpath": {
"title": "Classpath",
@@ -1394,7 +1478,14 @@
"anyOf": [
{
"additionalProperties": {
- "$ref": "#/$defs/JsonValue"
+ "anyOf": [
+ {
+ "$ref": "#/$defs/JsonValue"
+ },
+ {
+ "type": "null"
+ }
+ ]
},
"type": "object"
},
@@ -1441,7 +1532,14 @@
"anyOf": [
{
"additionalProperties": {
- "$ref": "#/$defs/JsonValue"
+ "anyOf": [
+ {
+ "$ref": "#/$defs/JsonValue"
+ },
+ {
+ "type": "null"
+ }
+ ]
},
"type": "object"
},
@@ -3271,17 +3369,10 @@
"description": "Update a task instance state to
reschedule/up_for_reschedule.",
"properties": {
"state": {
- "anyOf": [
- {
- "const": "up_for_reschedule",
- "type": "string"
- },
- {
- "type": "null"
- }
- ],
+ "const": "up_for_reschedule",
"default": "up_for_reschedule",
- "title": "State"
+ "title": "State",
+ "type": "string"
},
"reschedule_date": {
"format": "date-time",
@@ -3324,17 +3415,10 @@
"description": "Update a task instance state to up_for_retry.",
"properties": {
"state": {
- "anyOf": [
- {
- "const": "up_for_retry",
- "type": "string"
- },
- {
- "type": "null"
- }
- ],
+ "const": "up_for_retry",
"default": "up_for_retry",
- "title": "State"
+ "title": "State",
+ "type": "string"
},
"end_date": {
"format": "date-time",
@@ -3708,17 +3792,10 @@
"description": "Update a task's state to success. Includes task_outlets
and outlet_events for registering asset events.",
"properties": {
"state": {
- "anyOf": [
- {
- "const": "success",
- "type": "string"
- },
- {
- "type": "null"
- }
- ],
+ "const": "success",
"default": "success",
- "title": "State"
+ "title": "State",
+ "type": "string"
},
"end_date": {
"format": "date-time",
@@ -4002,7 +4079,14 @@
"description": "Response to GetTaskStateStore; wraps the generated API
response for supervisor to worker comms.",
"properties": {
"value": {
- "$ref": "#/$defs/JsonValue"
+ "anyOf": [
+ {
+ "$ref": "#/$defs/JsonValue"
+ },
+ {
+ "type": "null"
+ }
+ ]
},
"type": {
"const": "TaskStateStoreResult",
@@ -4227,6 +4311,33 @@
"title": "VariableKeysResult",
"type": "object"
},
+ "VariableResponse": {
+ "additionalProperties": false,
+ "description": "Variable schema for responses with fields that are
needed for Runtime.",
+ "properties": {
+ "key": {
+ "title": "Key",
+ "type": "string"
+ },
+ "value": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "title": "Value"
+ }
+ },
+ "required": [
+ "key",
+ "value"
+ ],
+ "title": "VariableResponse",
+ "type": "object"
+ },
"VariableResult": {
"additionalProperties": false,
"properties": {
@@ -4243,7 +4354,6 @@
"type": "null"
}
],
- "default": null,
"title": "Value"
},
"type": {
@@ -4254,7 +4364,8 @@
}
},
"required": [
- "key"
+ "key",
+ "value"
],
"title": "VariableResult",
"type": "object"
@@ -4286,7 +4397,14 @@
"type": "string"
},
"value": {
- "$ref": "#/$defs/JsonValue"
+ "anyOf": [
+ {
+ "$ref": "#/$defs/JsonValue"
+ },
+ {
+ "type": "null"
+ }
+ ]
},
"type": {
"const": "XComResult",
@@ -4342,97 +4460,6 @@
"title": "XComSequenceSliceResult",
"type": "object"
},
- "ConnectionResponse": {
- "description": "Connection schema for responses with fields that are
needed for Runtime.",
- "properties": {
- "conn_id": {
- "title": "Conn Id",
- "type": "string"
- },
- "conn_type": {
- "title": "Conn Type",
- "type": "string"
- },
- "host": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ],
- "title": "Host"
- },
- "schema": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ],
- "title": "Schema"
- },
- "login": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ],
- "title": "Login"
- },
- "password": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ],
- "title": "Password"
- },
- "port": {
- "anyOf": [
- {
- "type": "integer"
- },
- {
- "type": "null"
- }
- ],
- "title": "Port"
- },
- "extra": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ],
- "title": "Extra"
- }
- },
- "required": [
- "conn_id",
- "conn_type",
- "host",
- "schema",
- "login",
- "password",
- "port",
- "extra"
- ],
- "title": "ConnectionResponse",
- "type": "object"
- },
"AssetEventDagRunReference": {
"additionalProperties": false,
"description": "Schema for AssetEvent model used in DagRun.",
@@ -4529,6 +4556,34 @@
"title": "AssetEventDagRunReference",
"type": "object"
},
+ "AssetReferenceAssetEventDagRun": {
+ "additionalProperties": false,
+ "description": "Schema for AssetModel used in
AssetEventDagRunReference.",
+ "properties": {
+ "name": {
+ "title": "Name",
+ "type": "string"
+ },
+ "uri": {
+ "title": "Uri",
+ "type": "string"
+ },
+ "extra": {
+ "additionalProperties": {
+ "$ref": "#/$defs/JsonValue"
+ },
+ "title": "Extra",
+ "type": "object"
+ }
+ },
+ "required": [
+ "name",
+ "uri",
+ "extra"
+ ],
+ "title": "AssetReferenceAssetEventDagRun",
+ "type": "object"
+ },
"DagRun": {
"additionalProperties": false,
"description": "Schema for DagRun model with minimal required fields
needed for Runtime.",
@@ -4880,33 +4935,6 @@
],
"title": "TaskInstance",
"type": "object"
- },
- "VariableResponse": {
- "additionalProperties": false,
- "description": "Variable schema for responses with fields that are
needed for Runtime.",
- "properties": {
- "key": {
- "title": "Key",
- "type": "string"
- },
- "value": {
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ],
- "title": "Value"
- }
- },
- "required": [
- "key",
- "value"
- ],
- "title": "VariableResponse",
- "type": "object"
}
}
}
diff --git a/task-sdk/tests/conftest.py b/task-sdk/tests/conftest.py
index c1ef3b72c92..eed48a1554c 100644
--- a/task-sdk/tests/conftest.py
+++ b/task-sdk/tests/conftest.py
@@ -290,6 +290,8 @@ def make_ti_context() -> MakeTIContextCallable:
state=DagRunState.RUNNING,
conf=conf, # type: ignore
consumed_asset_events=list(consumed_asset_events),
+ end_date=None,
+ partition_key=None,
),
task_reschedule_count=task_reschedule_count,
max_tries=max_tries,
diff --git a/task-sdk/tests/task_sdk/api/test_client.py
b/task-sdk/tests/task_sdk/api/test_client.py
index 5c4bac56972..a7f69e948f1 100644
--- a/task-sdk/tests/task_sdk/api/test_client.py
+++ b/task-sdk/tests/task_sdk/api/test_client.py
@@ -1127,6 +1127,12 @@ class TestConnectionOperations:
json={
"conn_id": "test_conn",
"conn_type": "mysql",
+ "host": None,
+ "schema": None,
+ "login": None,
+ "password": None,
+ "port": None,
+ "extra": None,
},
)
return httpx.Response(status_code=400, json={"detail": "Bad
Request"})
@@ -1480,6 +1486,10 @@ class TestDagRunOperations:
"run_type": "scheduled",
"state": "success",
"consumed_asset_events": [],
+ "data_interval_start": None,
+ "data_interval_end": None,
+ "end_date": None,
+ "partition_key": None,
},
)
return httpx.Response(status_code=422)
@@ -1515,6 +1525,10 @@ class TestDagRunOperations:
"run_type": "scheduled",
"state": "success",
"consumed_asset_events": [],
+ "data_interval_start": None,
+ "data_interval_end": None,
+ "end_date": None,
+ "partition_key": None,
},
)
return httpx.Response(status_code=422)
diff --git a/task-sdk/tests/task_sdk/bases/test_hook.py
b/task-sdk/tests/task_sdk/bases/test_hook.py
index 351f63e039d..b15a957cd5c 100644
--- a/task-sdk/tests/task_sdk/bases/test_hook.py
+++ b/task-sdk/tests/task_sdk/bases/test_hook.py
@@ -110,6 +110,8 @@ class TestBaseHook:
login="user",
password="password",
port=443,
+ schema=None,
+ extra=None,
)
mock_supervisor_comms.asend.return_value = conn
diff --git a/task-sdk/tests/task_sdk/definitions/test_connection.py
b/task-sdk/tests/task_sdk/definitions/test_connection.py
index 5746b1b14f7..c973fc58c91 100644
--- a/task-sdk/tests/task_sdk/definitions/test_connection.py
+++ b/task-sdk/tests/task_sdk/definitions/test_connection.py
@@ -104,7 +104,16 @@ class TestConnections:
assert parsed_uri.path.lstrip("/") == "test_schema"
def test_conn_get(self, mock_supervisor_comms):
- conn_result = ConnectionResult(conn_id="mysql_conn",
conn_type="mysql", host="mysql", port=3306)
+ conn_result = ConnectionResult(
+ conn_id="mysql_conn",
+ conn_type="mysql",
+ host="mysql",
+ port=3306,
+ schema=None,
+ login=None,
+ password=None,
+ extra=None,
+ )
mock_supervisor_comms.send.return_value = conn_result
conn = Connection.get(conn_id="mysql_conn")
diff --git a/task-sdk/tests/task_sdk/execution_time/test_callback_supervisor.py
b/task-sdk/tests/task_sdk/execution_time/test_callback_supervisor.py
index c33299b313c..25a334b73a1 100644
--- a/task-sdk/tests/task_sdk/execution_time/test_callback_supervisor.py
+++ b/task-sdk/tests/task_sdk/execution_time/test_callback_supervisor.py
@@ -183,7 +183,16 @@ class TestCallbackHandleRequest:
client_mock=ClientMock(
method_path="connections.get",
args=("test_conn",),
- response=ConnectionResult(conn_id="test_conn",
conn_type="mysql"),
+ response=ConnectionResult(
+ conn_id="test_conn",
+ conn_type="mysql",
+ host=None,
+ schema=None,
+ login=None,
+ password=None,
+ port=None,
+ extra=None,
+ ), # type: ignore[call-arg]
),
),
RequestCase(
@@ -192,7 +201,16 @@ class TestCallbackHandleRequest:
client_mock=ClientMock(
method_path="connections.get",
args=("test_conn",),
- response=ConnectionResult(conn_id="test_conn",
conn_type="mysql", password="secret"),
+ response=ConnectionResult(
+ conn_id="test_conn",
+ conn_type="mysql",
+ password="secret",
+ host=None,
+ schema=None,
+ login=None,
+ port=None,
+ extra=None,
+ ), # type: ignore[call-arg]
),
mask_secret_args=("secret",),
),
diff --git a/task-sdk/tests/task_sdk/execution_time/test_comms.py
b/task-sdk/tests/task_sdk/execution_time/test_comms.py
index aa7264b8750..05dd682d890 100644
--- a/task-sdk/tests/task_sdk/execution_time/test_comms.py
+++ b/task-sdk/tests/task_sdk/execution_time/test_comms.py
@@ -96,6 +96,7 @@ class TestCommsDecoder:
"state": "success",
"conf": None,
"consumed_asset_events": [],
+ "partition_key": None,
},
"max_tries": 0,
"should_retry": False,
diff --git a/task-sdk/tests/task_sdk/execution_time/test_context.py
b/task-sdk/tests/task_sdk/execution_time/test_context.py
index d625c91c917..e34008ef9c7 100644
--- a/task-sdk/tests/task_sdk/execution_time/test_context.py
+++ b/task-sdk/tests/task_sdk/execution_time/test_context.py
@@ -246,7 +246,16 @@ class TestConnectionAccessor:
accessor = ConnectionAccessor()
# Conn from the supervisor / API Server
- conn_result = ConnectionResult(conn_id="mysql_conn",
conn_type="mysql", host="mysql", port=3306)
+ conn_result = ConnectionResult(
+ conn_id="mysql_conn",
+ conn_type="mysql",
+ host="mysql",
+ port=3306,
+ schema=None,
+ login=None,
+ password=None,
+ extra=None,
+ )
mock_supervisor_comms.send.return_value = conn_result
@@ -259,7 +268,16 @@ class TestConnectionAccessor:
def test_get_method_valid_connection(self, mock_supervisor_comms):
"""Test that the get method returns the requested connection using
`conn.get`."""
accessor = ConnectionAccessor()
- conn_result = ConnectionResult(conn_id="mysql_conn",
conn_type="mysql", host="mysql", port=3306)
+ conn_result = ConnectionResult(
+ conn_id="mysql_conn",
+ conn_type="mysql",
+ host="mysql",
+ port=3306,
+ schema=None,
+ login=None,
+ password=None,
+ extra=None,
+ )
mock_supervisor_comms.send.return_value = conn_result
@@ -289,6 +307,9 @@ class TestConnectionAccessor:
host="mysql",
port=3306,
extra='{"extra_key": "extra_value"}',
+ schema=None,
+ login=None,
+ password=None,
)
mock_supervisor_comms.send.return_value = conn_result
@@ -306,7 +327,14 @@ class TestConnectionAccessor:
# Conn from the supervisor / API Server
conn_result = ConnectionResult(
- conn_id="mysql_conn", conn_type="mysql", host="mysql", port=3306,
extra="This is not JSON!"
+ conn_id="mysql_conn",
+ conn_type="mysql",
+ host="mysql",
+ port=3306,
+ extra="This is not JSON!",
+ schema=None,
+ login=None,
+ password=None,
)
mock_supervisor_comms.send.return_value = conn_result
@@ -1070,6 +1098,11 @@ class TestInletEventAccessor:
run_type="scheduled",
state="success",
consumed_asset_events=[],
+ logical_date=None,
+ data_interval_start=None,
+ data_interval_end=None,
+ end_date=None,
+ partition_key=None,
)
mock_supervisor_comms.reset_mock()
mock_supervisor_comms.send.side_effect = [dag_run_result]
@@ -1115,6 +1148,8 @@ class TestDagRunStartDateNullable:
state="queued",
conf=None,
consumed_asset_events=[],
+ end_date=None,
+ partition_key=None,
)
assert dag_run.start_date is None
@@ -1193,6 +1228,10 @@ class TestSecretsBackend:
conn_type="http",
host="example.com",
port=443,
+ schema=None,
+ login=None,
+ password=None,
+ extra=None,
)
conn_result = ConnectionResult.from_conn_response(conn_response)
mock_supervisor_comms.send.return_value = conn_result
@@ -1225,6 +1264,11 @@ class TestSecretsBackend:
conn_id="test_conn",
conn_type="postgres",
host="db.example.com",
+ schema=None,
+ login=None,
+ password=None,
+ port=None,
+ extra=None,
)
conn_result = ConnectionResult.from_conn_response(conn_response)
mock_supervisor_comms.send.return_value = conn_result
diff --git a/task-sdk/tests/task_sdk/execution_time/test_context_cache.py
b/task-sdk/tests/task_sdk/execution_time/test_context_cache.py
index aa3b20ca9ce..58c9c51e153 100644
--- a/task-sdk/tests/task_sdk/execution_time/test_context_cache.py
+++ b/task-sdk/tests/task_sdk/execution_time/test_context_cache.py
@@ -97,6 +97,8 @@ class TestConnectionCacheIntegration:
port=3306,
login="user",
password="pass",
+ schema=None,
+ extra=None,
)
mock_ensure_backends.return_value = [ExecutionAPISecretsBackend()]
@@ -281,6 +283,10 @@ class TestAsyncConnectionCache:
conn_type="mysql",
host="host",
port=3306,
+ schema=None,
+ login=None,
+ password=None,
+ extra=None,
)
# Configure asend to return the conn_result when awaited
@@ -344,7 +350,16 @@ class TestCacheDisabled:
def test_get_connection_no_cache_when_disabled(self, mock_ensure_backends,
mock_supervisor_comms):
"""Test that cache is not used when disabled."""
conn_id = "test_conn"
- conn_result = ConnectionResult(conn_id=conn_id, conn_type="mysql",
host="host")
+ conn_result = ConnectionResult(
+ conn_id=conn_id,
+ conn_type="mysql",
+ host="host",
+ schema=None,
+ login=None,
+ password=None,
+ port=None,
+ extra=None,
+ )
mock_ensure_backends.return_value = [ExecutionAPISecretsBackend()]
diff --git a/task-sdk/tests/task_sdk/execution_time/test_secrets.py
b/task-sdk/tests/task_sdk/execution_time/test_secrets.py
index 5c9cb7a22f5..b97a85f3693 100644
--- a/task-sdk/tests/task_sdk/execution_time/test_secrets.py
+++ b/task-sdk/tests/task_sdk/execution_time/test_secrets.py
@@ -36,6 +36,9 @@ class TestExecutionAPISecretsBackend:
host="example.com",
port=443,
schema="https",
+ login=None,
+ password=None,
+ extra=None,
)
conn_result = ConnectionResult.from_conn_response(conn_response)
mock_supervisor_comms.send.return_value = conn_result
diff --git a/task-sdk/tests/task_sdk/execution_time/test_supervisor.py
b/task-sdk/tests/task_sdk/execution_time/test_supervisor.py
index 81b60c6a7d8..5928b4582e5 100644
--- a/task-sdk/tests/task_sdk/execution_time/test_supervisor.py
+++ b/task-sdk/tests/task_sdk/execution_time/test_supervisor.py
@@ -1600,9 +1600,28 @@ REQUEST_TEST_CASES = [
client_mock=ClientMock(
method_path="connections.get",
args=("test_conn",),
- response=ConnectionResult(conn_id="test_conn", conn_type="mysql"),
+ response=ConnectionResult(
+ conn_id="test_conn",
+ conn_type="mysql",
+ host=None,
+ schema=None,
+ login=None,
+ password=None,
+ port=None,
+ extra=None,
+ ), # type: ignore[call-arg]
),
- expected_body={"conn_id": "test_conn", "conn_type": "mysql", "type":
"ConnectionResult"},
+ expected_body={
+ "conn_id": "test_conn",
+ "conn_type": "mysql",
+ "host": None,
+ "schema": None,
+ "login": None,
+ "password": None,
+ "port": None,
+ "extra": None,
+ "type": "ConnectionResult",
+ },
),
RequestTestCase(
message=GetConnection(conn_id="test_conn"),
@@ -1610,12 +1629,26 @@ REQUEST_TEST_CASES = [
client_mock=ClientMock(
method_path="connections.get",
args=("test_conn",),
- response=ConnectionResult(conn_id="test_conn", conn_type="mysql",
password="password"),
+ response=ConnectionResult(
+ conn_id="test_conn",
+ conn_type="mysql",
+ password="password",
+ host=None,
+ schema=None,
+ login=None,
+ port=None,
+ extra=None,
+ ), # type: ignore[call-arg]
),
expected_body={
"conn_id": "test_conn",
"conn_type": "mysql",
"password": "password",
+ "host": None,
+ "schema": None,
+ "login": None,
+ "port": None,
+ "extra": None,
"type": "ConnectionResult",
},
mask_secret_args=("password",),
@@ -1626,12 +1659,26 @@ REQUEST_TEST_CASES = [
client_mock=ClientMock(
method_path="connections.get",
args=("test_conn",),
- response=ConnectionResult(conn_id="test_conn", conn_type="mysql",
schema="mysql"), # type: ignore[call-arg]
+ response=ConnectionResult(
+ conn_id="test_conn",
+ conn_type="mysql",
+ schema="mysql",
+ host=None,
+ login=None,
+ password=None,
+ port=None,
+ extra=None,
+ ), # type: ignore[call-arg]
),
expected_body={
"conn_id": "test_conn",
"conn_type": "mysql",
"schema": "mysql",
+ "host": None,
+ "login": None,
+ "password": None,
+ "port": None,
+ "extra": None,
"type": "ConnectionResult",
},
),
@@ -2426,6 +2473,10 @@ REQUEST_TEST_CASES = [
consumed_asset_events=[],
state=DagRunState.SUCCESS,
triggering_user_name=None,
+ data_interval_start=None,
+ data_interval_end=None,
+ end_date=None,
+ partition_key=None,
),
),
test_id="get_dag_run",
@@ -2486,6 +2537,10 @@ REQUEST_TEST_CASES = [
consumed_asset_events=[],
state=DagRunState.SUCCESS,
triggering_user_name=None,
+ data_interval_start=None,
+ data_interval_end=None,
+ end_date=None,
+ partition_key=None,
)
),
),
@@ -3525,6 +3580,12 @@ def test_remote_logging_conn(remote_logging,
remote_conn, expected_env, monkeypa
# Minimal enough to pass validation, we don't care what fields
are in here for the tests
"conn_id": remote_conn,
"conn_type": "aws",
+ "host": None,
+ "schema": None,
+ "login": None,
+ "password": None,
+ "port": None,
+ "extra": None,
},
)
@@ -3862,7 +3923,7 @@ def
test_fetch_remote_logging_conn_does_not_cache_none_result(mocker):
conn_id=conn_id,
conn_type="example",
host=None,
- schema_=None,
+ schema=None,
login=None,
password=None,
port=None,
@@ -3934,7 +3995,14 @@ def test_reinit_supervisor_comms(monkeypatch,
client_with_ti_start, caplog):
subprocess.check_call([sys.executable, "-c", dedent(script)])
client_with_ti_start.connections.get.return_value = ConnectionResult(
- conn_id="test_conn", conn_type="mysql", login="a", password="password1"
+ conn_id="test_conn",
+ conn_type="mysql",
+ login="a",
+ password="password1",
+ host=None,
+ schema=None,
+ port=None,
+ extra=None,
)
proc = ActivitySubprocess.start(
dag_rel_path=os.devnull,
diff --git a/task-sdk/tests/task_sdk/execution_time/test_task_runner.py
b/task-sdk/tests/task_sdk/execution_time/test_task_runner.py
index 9714a49e872..5a96450000d 100644
--- a/task-sdk/tests/task_sdk/execution_time/test_task_runner.py
+++ b/task-sdk/tests/task_sdk/execution_time/test_task_runner.py
@@ -2170,6 +2170,7 @@ class TestRuntimeTaskInstance:
password="passwordvalue",
schema="schemavalues",
extra='{"extra__asana__workspace": "extra1"}',
+ port=None,
)
mock_supervisor_comms.send.return_value = conn
@@ -2869,6 +2870,10 @@ class TestRuntimeTaskInstance:
run_type="scheduled",
state="success",
consumed_asset_events=[],
+ data_interval_start=None,
+ data_interval_end=None,
+ end_date=None,
+ partition_key=None,
)
mock_supervisor_comms.send.return_value =
PreviousDagRunResult(dag_run=dag_run_data)
@@ -2898,6 +2903,10 @@ class TestRuntimeTaskInstance:
run_type="scheduled",
state="success",
consumed_asset_events=[],
+ data_interval_start=None,
+ data_interval_end=None,
+ end_date=None,
+ partition_key=None,
)
mock_supervisor_comms.send.return_value =
PreviousDagRunResult(dag_run=dag_run_data)
diff --git a/uv.lock b/uv.lock
index 317f7368d02..6f593f9fb85 100644
--- a/uv.lock
+++ b/uv.lock
@@ -2213,7 +2213,7 @@ provides-extras = ["dev"]
[package.metadata.requires-dev]
codegen = [
{ name = "apache-airflow-devel-common", editable = "devel-common" },
- { name = "datamodel-code-generator", extras = ["http"], specifier =
"==0.33.0" },
+ { name = "datamodel-code-generator", extras = ["http"], specifier =
">=0.71.0" },
]
dev = [
{ name = "apache-airflow-ctl", extras = ["dev"], editable = "airflow-ctl"
},
@@ -8934,7 +8934,7 @@ provides-extras = ["all", "datadog", "otel", "sentry",
"statsd"]
[package.metadata.requires-dev]
codegen = [
- { name = "datamodel-code-generator", extras = ["http"], specifier =
"==0.33.0" },
+ { name = "datamodel-code-generator", extras = ["http"], specifier =
">=0.71.0" },
{ name = "openapi-spec-validator", specifier = ">=0.7.1" },
{ name = "rich", specifier = ">=13.6.0" },
{ name = "svcs", specifier = ">=25.1.0" },
@@ -11323,23 +11323,22 @@ wheels = [
[[package]]
name = "datamodel-code-generator"
-version = "0.33.0"
+version = "0.71.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "argcomplete" },
- { name = "black" },
+ { name = "black", marker = "sys_platform != 'emscripten'" },
{ name = "genson" },
{ name = "inflect" },
- { name = "isort" },
+ { name = "isort", marker = "sys_platform != 'emscripten'" },
{ name = "jinja2" },
- { name = "packaging" },
{ name = "pydantic" },
{ name = "pyyaml" },
- { name = "tomli", marker = "python_full_version < '3.12'" },
+ { name = "tomli", marker = "python_full_version < '3.11'" },
]
-sdist = { url =
"https://files.pythonhosted.org/packages/7d/a0/3f81c5c0c31d6f25f459e370e04553810f096e5dbd3cf7eda2a67709cd78/datamodel_code_generator-0.33.0.tar.gz",
hash =
"sha256:7635ef788201d69bd3e98ba88ce6afe479400dc2737fe9d5e21f87408f352c08", size
= 458695, upload-time = "2025-08-14T13:50:36.965Z" }
+sdist = { url =
"https://files.pythonhosted.org/packages/54/f5/f4ce23d99503b147c9ec514dc995a96d3b4d2a3284252ad665f875a3145d/datamodel_code_generator-0.71.0.tar.gz",
hash =
"sha256:d27cd7a0d10f9b2db74a41db7f3e050c226da9cf0afb4916a7ab56275ebacbf2", size
= 1684916, upload-time = "2026-07-24T15:32:04.334Z" }
wheels = [
- { url =
"https://files.pythonhosted.org/packages/3b/d0/acd7a19dad4dc4118d2b6ba06df9a4a3725729e91fa3f2c63a765d4e7d44/datamodel_code_generator-0.33.0-py3-none-any.whl",
hash =
"sha256:e229264aa612b2d5bb4901bcd6c520a799ae0d5c19262577a0f876eb48afaaa3", size
= 121148, upload-time = "2025-08-14T13:50:35.306Z" },
+ { url =
"https://files.pythonhosted.org/packages/c6/4d/556cb290170f41b97ce50fd872e10a266f141d7a38352bb3071e4ae61f41/datamodel_code_generator-0.71.0-py3-none-any.whl",
hash =
"sha256:680b68338d59e98a0559eeb54d8e5ca33c35b3ec0bef922ec2cc783f2cb28e9a", size
= 452379, upload-time = "2026-07-24T15:32:02.467Z" },
]
[package.optional-dependencies]