from dataclasses import dataclass, field from typing import Any, Protocol from ...dominio import Timeline @dataclass class ContextoDeAnalise: timeline: Timeline | None = None dados_da_timeline: dict[str, Any] | None = None erros: list[str] = field(default_factory=list) avisos: list[str] = field(default_factory=list) analises_concluidas: list[str] = field(default_factory=list) transcricoes: dict[str, list[Any]] = field(default_factory=dict) caracteristicas_visuais: dict[str, dict[str, Any]] = field(default_factory=dict) cenas: list[Any] = field(default_factory=list) cenas_visuais: list[Any] = field(default_factory=list) eventos: list[Any] = field(default_factory=list) arquivos: dict[str, Any] = field(default_factory=dict) metadados_dos_arquivos: dict[str, Any] = field(default_factory=dict) class Analisador(Protocol): nome: str def executar(self, contexto: ContextoDeAnalise) -> ContextoDeAnalise: ... class PipelineDoScanner: """Executa análises em ordem, sem conhecer sua implementação.""" def __init__(self, analises: list[Analisador]) -> None: self.analises = analises def executar(self, contexto: ContextoDeAnalise) -> ContextoDeAnalise: for analise in self.analises: contexto = analise.executar(contexto) contexto.analises_concluidas.append(analise.nome) return contexto class AnalisadorDeTimeline: """Ponto de entrada da análise da timeline.""" def __init__(self, pipeline: PipelineDoScanner) -> None: self.pipeline = pipeline def analisar(self, timeline: Timeline | None = None) -> ContextoDeAnalise: return self.pipeline.executar(ContextoDeAnalise(timeline=timeline))