97-documentation/ns_report_publisher/model.py

from __future__ import annotations

from dataclasses import dataclass, field
from pathlib import Path
from typing import Any, Literal


@dataclass(frozen=True)
class SourceDocument:
    path: Path
    relative_path: Path
    metadata: dict[str, str]
    markdown: str
    title: str
    output_path: Path


@dataclass(frozen=True)
class ArtifactReference:
    raw_reference: str
    identifier: str
    visible_label: str
    href: str | None
    status: Literal["resolved", "unresolved", "ambiguous"]
    knowledge_kind: Literal["glossary", "learning-nugget"] | None = None
    short_text: str = ""
    detail_text: str = ""
    topic: str = ""
    term_type: str = ""
    presentation_dimension: str = ""
    artifact_type: str = ""
    target_title: str = ""


@dataclass(frozen=True)
class ProcessingAnnotation:
    kind: Literal["todo", "review"]
    content: str
    block: bool


@dataclass(frozen=True)
class ValidationFinding:
    code: str
    message: str
    reference: str


@dataclass(frozen=True)
class ProcessedDocument:
    source: SourceDocument
    markdown: str
    artifact_references: tuple[ArtifactReference, ...] = ()
    processing_annotations: tuple[ProcessingAnnotation, ...] = ()
    validation_findings: tuple[ValidationFinding, ...] = ()

    @property
    def path(self) -> Path:
        return self.source.path

    @property
    def relative_path(self) -> Path:
        return self.source.relative_path

    @property
    def metadata(self) -> dict[str, str]:
        return self.source.metadata

    @property
    def title(self) -> str:
        return self.source.title

    @property
    def output_path(self) -> Path:
        return self.source.output_path


@dataclass
class NavigationNode:
    name: str = ""
    directories: dict[str, "NavigationNode"] = field(default_factory=dict)
    documents: list[SourceDocument] = field(default_factory=list)


@dataclass(frozen=True)
class ArtifactTarget:
    identifier: str
    document: SourceDocument
    priority: int = 0
    source_kind: str = "artifact-id"


@dataclass
class PublicationContext:
    source_root: Path
    output_root: Path
    documents: list[SourceDocument]
    navigation: NavigationNode
    artifact_targets: dict[str, list[ArtifactTarget]]
    processed_documents: list[ProcessedDocument] = field(default_factory=list)
    copied_assets: set[str] = field(default_factory=set)
    unresolved_references: list[str] = field(default_factory=list)
    ambiguous_references: list[str] = field(default_factory=list)
    extra: dict[str, Any] = field(default_factory=dict)