Expand governed Dataflow editor and node library
This commit is contained in:
@@ -4,7 +4,7 @@ import math
|
||||
from datetime import datetime
|
||||
from typing import Any, Literal
|
||||
|
||||
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
||||
from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator
|
||||
|
||||
|
||||
PipelineStatus = Literal["draft", "active", "archived"]
|
||||
@@ -152,6 +152,8 @@ class PipelinePreviewResponse(BaseModel):
|
||||
truncated: bool
|
||||
diagnostics: list[DataflowDiagnostic]
|
||||
node_diagnostics: list[NodePreviewDiagnostic]
|
||||
source_fingerprints: list[dict[str, Any]]
|
||||
input_row_count: int
|
||||
definition_hash: str
|
||||
executor_version: str
|
||||
|
||||
@@ -159,3 +161,93 @@ class PipelinePreviewResponse(BaseModel):
|
||||
class PipelineDeleteResponse(BaseModel):
|
||||
deleted: bool
|
||||
pipeline_id: str
|
||||
|
||||
|
||||
class NodePortDefinitionResponse(BaseModel):
|
||||
id: str
|
||||
label: str
|
||||
required: bool
|
||||
multiple: bool
|
||||
minimum_connections: int
|
||||
|
||||
|
||||
class NodeConfigFieldResponse(BaseModel):
|
||||
id: str
|
||||
label: str
|
||||
kind: str
|
||||
required: bool
|
||||
description: str | None
|
||||
options: list[tuple[str, str]]
|
||||
|
||||
|
||||
class NodeTypeDefinitionResponse(BaseModel):
|
||||
type: str
|
||||
category: str
|
||||
category_label: str
|
||||
label: str
|
||||
description: str
|
||||
icon: str
|
||||
input_ports: list[NodePortDefinitionResponse]
|
||||
output_ports: list[NodePortDefinitionResponse]
|
||||
config_fields: list[NodeConfigFieldResponse]
|
||||
default_config: dict[str, Any]
|
||||
sql_support: str
|
||||
|
||||
|
||||
class NodeLibraryResponse(BaseModel):
|
||||
nodes: list[NodeTypeDefinitionResponse]
|
||||
|
||||
|
||||
class TabularSourceColumnResponse(BaseModel):
|
||||
name: str
|
||||
data_type: str
|
||||
nullable: bool
|
||||
|
||||
|
||||
class TabularSourceResponse(BaseModel):
|
||||
ref: str
|
||||
provider: str
|
||||
source_name: str
|
||||
name: str
|
||||
description: str | None
|
||||
columns: list[TabularSourceColumnResponse]
|
||||
schema_version: str
|
||||
fingerprint: str
|
||||
row_count: int | None
|
||||
byte_count: int | None
|
||||
updated_at: datetime | None
|
||||
capabilities: list[str]
|
||||
|
||||
|
||||
class TabularSourceListResponse(BaseModel):
|
||||
available: bool
|
||||
writable: bool
|
||||
sources: list[TabularSourceResponse]
|
||||
|
||||
|
||||
class TabularSnapshotCreateRequest(BaseModel):
|
||||
name: str = Field(min_length=1, max_length=300)
|
||||
source_name: str = Field(
|
||||
min_length=1,
|
||||
max_length=120,
|
||||
pattern=r"^[A-Za-z_][A-Za-z0-9_]*$",
|
||||
)
|
||||
description: str | None = Field(default=None, max_length=4000)
|
||||
format: Literal["json", "csv"] = "json"
|
||||
rows: list[dict[str, Any]] | None = Field(default=None, max_length=10_000)
|
||||
csv_text: str | None = Field(default=None, max_length=5_000_000)
|
||||
delimiter: str = Field(default=",", min_length=1, max_length=1)
|
||||
|
||||
@model_validator(mode="after")
|
||||
def validate_format_payload(self) -> TabularSnapshotCreateRequest:
|
||||
if self.format == "json":
|
||||
if self.rows is None:
|
||||
raise ValueError("JSON snapshots require rows.")
|
||||
if self.csv_text is not None:
|
||||
raise ValueError("JSON snapshots cannot include CSV text.")
|
||||
else:
|
||||
if not self.csv_text:
|
||||
raise ValueError("CSV snapshots require CSV text.")
|
||||
if self.rows is not None:
|
||||
raise ValueError("CSV snapshots cannot include JSON rows.")
|
||||
return self
|
||||
|
||||
Reference in New Issue
Block a user