Files
repo-scoping/src/repo_registry/core/models.py
2026-05-02 11:54:07 +02:00

331 lines
7.1 KiB
Python

from __future__ import annotations
from dataclasses import dataclass, field
from typing import Any
def confidence_label(confidence: float) -> str:
if confidence >= 0.8:
return "high"
if confidence >= 0.5:
return "medium"
return "low"
@dataclass(frozen=True)
class Repository:
id: int
name: str
url: str
description: str | None
branch: str
status: str
@dataclass(frozen=True)
class RepositorySnapshot:
id: int
repository_id: int
commit_hash: str
branch: str
source_path: str
file_count: int
@dataclass(frozen=True)
class AnalysisRun:
id: int
repository_id: int
snapshot_id: int | None
status: str
started_at: str
completed_at: str | None
error_message: str | None
scanner_version: str
@dataclass(frozen=True)
class ReviewDecision:
id: int
repository_id: int
analysis_run_id: int | None
action: str
notes: str
created_at: str
@dataclass(frozen=True)
class ExpectationGap:
id: int
repository_id: int
analysis_run_id: int | None
expected_type: str
expected_name: str
source: str
notes: str
status: str
created_at: str
@dataclass(frozen=True)
class AnalysisRunDiffItem:
change_type: str
item_type: str
key: str
base: dict[str, Any] | None = None
target: dict[str, Any] | None = None
@dataclass(frozen=True)
class AnalysisRunDiffSection:
added: list[AnalysisRunDiffItem] = field(default_factory=list)
removed: list[AnalysisRunDiffItem] = field(default_factory=list)
changed: list[AnalysisRunDiffItem] = field(default_factory=list)
weakened: list[AnalysisRunDiffItem] = field(default_factory=list)
@dataclass(frozen=True)
class AnalysisRunDiff:
repository: Repository
base_run: AnalysisRun
target_run: AnalysisRun
facts: AnalysisRunDiffSection
chunks: AnalysisRunDiffSection
candidates: AnalysisRunDiffSection
approved_entries: AnalysisRunDiffSection
@dataclass(frozen=True)
class ObservedFact:
id: int
repository_id: int
analysis_run_id: int
snapshot_id: int | None
kind: str
path: str
name: str
value: str
metadata: dict[str, Any]
@dataclass(frozen=True)
class ContentChunk:
id: int
repository_id: int
analysis_run_id: int
snapshot_id: int | None
path: str
kind: str
start_line: int
end_line: int
text: str
metadata: dict[str, Any] = field(default_factory=dict)
@dataclass(frozen=True)
class ScanSummary:
analysis_run: AnalysisRun
snapshot: RepositorySnapshot | None
facts: list[ObservedFact]
@dataclass(frozen=True)
class CharacteristicRebuildResult:
repository: Repository
analysis_run: AnalysisRun
dry_run: bool
confirmed: bool
cleared_approved: bool
previous_counts: dict[str, int]
previous_ids: dict[str, list[int]]
candidate_counts: dict[str, int]
@dataclass(frozen=True)
class SourceReference:
fact_id: int | None
path: str
kind: str
name: str
line: int | None = None
@dataclass(frozen=True)
class CandidateEvidence:
id: int
type: str
reference: str
strength: str
status: str
source_refs: list[SourceReference]
target_kind: str = "capability"
target_id: int | None = None
reference_kind: str = "source"
reference_id: int | None = None
@dataclass(frozen=True)
class CandidateFeature:
id: int
name: str
type: str
location: str
confidence: float
status: str
source_refs: list[SourceReference]
confidence_label: str = ""
primary_class: str = ""
attributes: list[str] = field(default_factory=list)
@dataclass(frozen=True)
class CandidateCapability:
id: int
name: str
description: str
inputs: list[str]
outputs: list[str]
confidence: float
status: str
source_refs: list[SourceReference]
confidence_label: str = ""
primary_class: str = "capability"
attributes: list[str] = field(default_factory=list)
features: list[CandidateFeature] = field(default_factory=list)
evidence: list[CandidateEvidence] = field(default_factory=list)
@dataclass(frozen=True)
class CandidateAbility:
id: int
name: str
description: str
confidence: float
status: str
source_refs: list[SourceReference]
confidence_label: str = ""
primary_class: str = "ability"
attributes: list[str] = field(default_factory=list)
capabilities: list[CandidateCapability] = field(default_factory=list)
@dataclass(frozen=True)
class CandidateGraph:
repository: Repository
analysis_run: AnalysisRun
abilities: list[CandidateAbility]
@dataclass(frozen=True)
class Evidence:
id: int
type: str
reference: str
strength: str
source_refs: list[SourceReference] = field(default_factory=list)
target_kind: str = "capability"
target_id: int | None = None
reference_kind: str = "source"
reference_id: int | None = None
@dataclass(frozen=True)
class Scope:
id: int
name: str
description: str
confidence: float
confidence_label: str = ""
@dataclass(frozen=True)
class Feature:
id: int
name: str
type: str
location: str
confidence: float
confidence_label: str = ""
source_refs: list[SourceReference] = field(default_factory=list)
primary_class: str = ""
attributes: list[str] = field(default_factory=list)
@dataclass(frozen=True)
class Capability:
id: int
name: str
description: str
inputs: list[str]
outputs: list[str]
confidence: float
confidence_label: str = ""
primary_class: str = "capability"
attributes: list[str] = field(default_factory=list)
features: list[Feature] = field(default_factory=list)
evidence: list[Evidence] = field(default_factory=list)
@dataclass(frozen=True)
class Ability:
id: int
name: str
description: str
confidence: float
confidence_label: str = ""
primary_class: str = "ability"
attributes: list[str] = field(default_factory=list)
capabilities: list[Capability] = field(default_factory=list)
@dataclass(frozen=True)
class RepositoryAbilityMap:
repository: Repository
scope: Scope
abilities: list[Ability]
@dataclass(frozen=True)
class SearchResult:
repository_id: int
repository_name: str
match_type: str
match_name: str
confidence: float
confidence_label: str = ""
match_description: str = ""
matched_field: str = ""
ability_id: int | None = None
ability_name: str | None = None
capability_id: int | None = None
capability_name: str | None = None
evidence_level: str | None = None
source_reference: str | None = None
text_score: float = 0.0
vector_score: float = 0.0
hybrid_score: float = 0.0
@dataclass(frozen=True)
class AbilitySummary:
id: int
repository_id: int
repository_name: str
name: str
description: str
confidence: float
confidence_label: str = ""
@dataclass(frozen=True)
class CapabilitySummary:
id: int
repository_id: int
repository_name: str
ability_id: int
ability_name: str
name: str
description: str
confidence: float
confidence_label: str = ""