Source code for dsw_document_template_tool.models
"""Dataclasses shared by the workflow, API client, and CLI."""
from __future__ import annotations
from dataclasses import dataclass, field
from pathlib import Path
PRIVATE_PROJECT_VISIBILITY = "PrivateProjectVisibility"
RESTRICTED_PROJECT_SHARING = "RestrictedProjectSharing"
[docs]
@dataclass(frozen=True)
class TemplateCoordinates:
"""Stable document template coordinates."""
organization_id: str
template_id: str
version: str
@property
def full_id(self) -> str:
"""Return ``organizationId:templateId:version``."""
return f"{self.organization_id}:{self.template_id}:{self.version}"
[docs]
@dataclass(frozen=True)
class DocumentTemplateReference:
"""Released template identifiers exposed by different DSW API generations."""
template_id: str | None = None
uuid: str | None = None
[docs]
@dataclass(frozen=True)
class ApiConfig:
"""DSW API connection configuration."""
url: str
token: str | None = None
email: str | None = None
password: str | None = None
verify_ssl: bool = False
[docs]
@dataclass(frozen=True)
class TdkConfig:
"""Configuration for the `dsw-tdk` executable."""
executable: str = "dsw-tdk"
[docs]
@dataclass(frozen=True)
class SubjectConfig:
"""One regression subject, such as baseline or candidate."""
kind: str
value: str
verify: bool = True
stage_id: str | None = None
[docs]
@dataclass(frozen=True)
class ProjectSeedConfig:
"""Recipe for creating a fixture project from a knowledge model package."""
name: str
knowledge_model_package_id: str
question_tag_uuids: list[str] = field(default_factory=list)
visibility: str = PRIVATE_PROJECT_VISIBILITY
sharing: str = RESTRICTED_PROJECT_SHARING
[docs]
@dataclass(frozen=True)
class GeneratedFixtureConfig:
"""Recipe for deterministic random fixture projects."""
name_prefix: str
count: int
seed: int
project: ProjectSeedConfig
selection_pool_size: int
max_events: int = 260
max_items_per_list: int = 2
answer_probability: float = 1.0
require_complete_coverage: bool = False
[docs]
@dataclass(frozen=True)
class FixtureConfig:
"""One regression fixture project."""
name: str
project_uuid: str | None = None
project_event_uuid: str | None = None
project: ProjectSeedConfig | None = None
events_file: Path | None = None
[docs]
@dataclass(frozen=True)
class RegressionConfig:
"""Regression execution settings."""
assertion: str
mode: str
format_uuid: str
output_dir: Path
timeout_seconds: int
poll_seconds: float
cleanup_projects: bool = False
ignore_patterns: list[str] = field(default_factory=list)
[docs]
@dataclass(frozen=True)
class WorkflowConfig:
"""Top-level workflow configuration loaded from YAML."""
config_path: Path
api: ApiConfig
tdk: TdkConfig
baseline: SubjectConfig | None
candidate: SubjectConfig
regression: RegressionConfig
fixtures: list[FixtureConfig]
generated_fixtures: list[GeneratedFixtureConfig] = field(default_factory=list)
[docs]
@dataclass(frozen=True)
class ResolvedSubject:
"""A subject after local staging or remote lookup has completed."""
label: str
mode: str
source_value: str
display_id: str
template_reference: DocumentTemplateReference | None = None
draft_uuid: str | None = None
local_dir: Path | None = None
staged_dir: Path | None = None
[docs]
@dataclass(frozen=True)
class FixtureProject:
"""Resolved fixture project information used during one regression run."""
name: str
project_uuid: str
project_event_uuid: str | None
created_by_tool: bool
[docs]
@dataclass(frozen=True)
class RenderArtifact:
"""Paths for one rendered subject output."""
raw_path: Path
normalized_path: Path
subject_label: str
template_reference: str
[docs]
@dataclass(frozen=True)
class FixtureRegressionResult:
"""Result for one fixture assertion."""
fixture_name: str
project_uuid: str
passed: bool
baseline: RenderArtifact | None
candidate: RenderArtifact
diff_path: Path | None
[docs]
@dataclass(frozen=True)
class RegressionReport:
"""Final workflow report written to disk and printed by the CLI."""
assertion: str
mode: str
output_dir: Path
passed: bool
fixture_results: list[FixtureRegressionResult]
report_path: Path