Skip to main content

Modelos de Dados

Todos os modelos são dataclasses imutáveis (frozen=True) definidas em src/core/models.py.

MrEvent

Representa um evento de Merge Request recebido do webhook.

@dataclass(frozen=True)
class MrEvent:
project_id: int # ID do projeto no GitLab
mr_iid: int # IID do Merge Request
action: Action # "open" | "update"
target_branch: str # Branch destino
source_branch: str # Branch origem
title: str # Título do MR
description: str # Descrição do MR
base_sha: str # SHA da base (diff_refs)
start_sha: str # SHA inicial (diff_refs)
head_sha: str # SHA do HEAD (diff_refs)
oldrev: Optional[str] # SHA anterior (apenas action="update")
newrev: Optional[str] # SHA novo (apenas action="update")

Regras de seleção

actionCondiçãoDados obtidos via
openSempreGET /merge_requests/:id/changes
updateoldrev presenteGET /repository/compare?from=oldrev&to=newrev
updateoldrev ausenteIgnorado (retorna None)

FileDiff

Representa o diff de um único arquivo.

@dataclass(frozen=True)
class FileDiff:
old_path: str # Caminho original
new_path: str # Caminho atual
lines: list[DiffLine] # Linhas parseadas do diff

DiffLine

Uma linha individual do diff.

@dataclass(frozen=True)
class DiffLine:
new_line: Optional[int] # Número da linha no novo arquivo (None se deletada)
old_line: Optional[int] # Número da linha no arquivo antigo (None se adicionada)
content: str # Conteúdo da linha (sem o prefixo +/-)
is_addition: bool # True se linha foi adicionada

Exemplo de parsing

Diff de entrada:

@@ -1,3 +1,4 @@
line one
+line two new
line three
-line four old
line five

Resultado:

new_lineold_linecontentis_addition
11line onefalse
2-line two newtrue
32line threefalse
-3line four oldfalse
44line fivefalse

Finding

Um achado/recomendação do LLM.

@dataclass(frozen=True)
class Finding:
line: int # Número da linha (new_line) no diff
severity: Severity # "high" | "medium" | "low"
category: Category # "bug" | "security" | "performance" | "clean_code"
message: str # Descrição curta e acionável

Categorias

CategoriaDescriçãoExemplo
bugErros lógicos, race conditions, null dereferencesVariável usada antes da inicialização
securityVulnerabilidades, injeção, exposição de dadosSQL injection, hardcoded secrets
performanceIneficiências, O(n²), I/O desnecessárioLoop com query N+1
clean_codeLegibilidade, naming, complexityFunção muito longa, nome confuso

Severidade

NívelCritério
highBug crítico, vulnerabilidade de segurança, perda de dados
mediumPerformance ruim, código frágil, manutenibilidade
lowStyle guide, sugestões opcionais, best practices

Position (dict)

Mapeamento de um Finding para uma posição inline no GitLab Discussions API.

{
"position_type": "text",
"base_sha": "...",
"start_sha": "...",
"head_sha": "...",
"old_path": "file.py",
"new_path": "file.py",
"new_line": 42
}

Retornado por map_finding_to_position(). Se None, o finding é postado como comentário global (fallback).