You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
orquestrador/shared/contracts/tool_publication.py

140 lines
3.6 KiB
Python

from __future__ import annotations
from datetime import datetime
from enum import Enum
from pydantic import BaseModel, Field
class ServiceName(str, Enum):
PRODUCT = "product"
ADMIN = "admin"
class ToolLifecycleStatus(str, Enum):
DRAFT = "draft"
GENERATED = "generated"
VALIDATED = "validated"
APPROVED = "approved"
ACTIVE = "active"
FAILED = "failed"
ARCHIVED = "archived"
class ToolLifecycleStageContract(BaseModel):
code: ToolLifecycleStatus
label: str
description: str
order: int = Field(ge=1)
terminal: bool = False
TOOL_LIFECYCLE_STAGES: tuple[ToolLifecycleStageContract, ...] = (
ToolLifecycleStageContract(
code=ToolLifecycleStatus.DRAFT,
label="Draft",
description="Estado inicial de uma tool ainda em definicao.",
order=1,
terminal=False,
),
ToolLifecycleStageContract(
code=ToolLifecycleStatus.GENERATED,
label="Generated",
description="Implementacao gerada e pronta para analise tecnica.",
order=2,
terminal=False,
),
ToolLifecycleStageContract(
code=ToolLifecycleStatus.VALIDATED,
label="Validated",
description="Tool validada automaticamente com verificacoes basicas.",
order=3,
terminal=False,
),
ToolLifecycleStageContract(
code=ToolLifecycleStatus.APPROVED,
label="Approved",
description="Versao revisada e aprovada para publicacao controlada.",
order=4,
terminal=False,
),
ToolLifecycleStageContract(
code=ToolLifecycleStatus.ACTIVE,
label="Active",
description="Tool publicada e apta a abastecer o runtime de produto.",
order=5,
terminal=False,
),
ToolLifecycleStageContract(
code=ToolLifecycleStatus.FAILED,
label="Failed",
description="Falha registrada na geracao, validacao ou ativacao.",
order=6,
terminal=True,
),
ToolLifecycleStageContract(
code=ToolLifecycleStatus.ARCHIVED,
label="Archived",
description="Versao retirada de circulacao e mantida apenas para historico.",
order=7,
terminal=True,
),
)
TOOL_LIFECYCLE_STATUS_SEQUENCE: tuple[ToolLifecycleStatus, ...] = tuple(
stage.code for stage in TOOL_LIFECYCLE_STAGES
)
_TOOL_LIFECYCLE_STAGE_BY_STATUS = {
stage.code: stage for stage in TOOL_LIFECYCLE_STAGES
}
def get_tool_lifecycle_stage(
status: ToolLifecycleStatus | str,
) -> ToolLifecycleStageContract:
normalized_status = (
status
if isinstance(status, ToolLifecycleStatus)
else ToolLifecycleStatus(str(status or "").strip().lower())
)
return _TOOL_LIFECYCLE_STAGE_BY_STATUS[normalized_status]
class ToolParameterType(str, Enum):
STRING = "string"
INTEGER = "integer"
NUMBER = "number"
BOOLEAN = "boolean"
OBJECT = "object"
ARRAY = "array"
class ToolParameterContract(BaseModel):
name: str
parameter_type: ToolParameterType
description: str
required: bool = True
class PublishedToolContract(BaseModel):
tool_name: str
display_name: str
description: str
version: int = Field(ge=1)
status: ToolLifecycleStatus
parameters: tuple[ToolParameterContract, ...] = ()
implementation_module: str
implementation_callable: str
checksum: str | None = None
published_at: datetime | None = None
published_by: str | None = None
class ToolPublicationEnvelope(BaseModel):
source_service: ServiceName = ServiceName.ADMIN
target_service: ServiceName = ServiceName.PRODUCT
publication_id: str
published_tool: PublishedToolContract
emitted_at: datetime