File size: 2,646 Bytes
52412a3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e407ec0
52412a3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f662601
88add17
f662601
 
 
 
 
 
 
 
 
52412a3
 
 
 
 
f662601
52412a3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
"""Exceptions du domaine — Sprint A14-S4.

Hiérarchie centrée sur ``PicaronesError`` pour qu'un caller puisse
attraper "toute erreur métier Picarones" avec un seul ``except``.

Règle d'or : ne JAMAIS attraper ``PicaronesError`` dans le code
métier sans le re-lever — c'est le rôle de la couche transport
(``app/services/`` puis ``interfaces/``) de mapper ces erreurs
vers HTTP 4xx / sortie CLI explicite.

Volontairement plat (pas de hiérarchie profonde) : on ajoute des
sous-classes au cas par cas quand un caller a besoin de discriminer.
"""

from __future__ import annotations


class PicaronesError(Exception):
    """Racine de la hiérarchie d'erreurs métier de Picarones.

    Tout sous-package du nouveau code (``domain/``, ``evaluation/``,
    ``pipeline/``, ``formats/``, ``adapters/``, ``app/``) doit lever
    une sous-classe de ``PicaronesError`` plutôt qu'un ``Exception``
    générique ou un ``ValueError`` quand l'erreur a un sens métier.

    L'ancien code (``picarones.core``, ``picarones.evaluation.metrics``,
    etc.) garde son comportement actuel jusqu'à sa migration.
    """


class ArtifactValidationError(PicaronesError):
    """Un artefact ne respecte pas les invariants de son type.

    Exemples : un ``Artifact`` typé ``ALTO_XML`` dont le ``content_hash``
    est absent ; un ``Artifact`` dont le ``produced_by_step`` référence
    une étape qui n'existe pas dans la pipeline.
    """


class ProjectionError(PicaronesError):
    """Un projecteur ne peut pas convertir l'artefact source.

    Levée typiquement par les projecteurs ALTO→texte / PAGE→texte
    quand le XML d'entrée n'est pas parsable, n'a pas de TextLine,
    ou que l'ordre de lecture est ambigu.

    Le caller (``EvaluationViewExecutor``) doit propager cette erreur
    dans le ``ProjectionReport`` plutôt que de l'absorber silencieusement.
    """


class CorpusSpecError(PicaronesError):
    """Le ``CorpusSpec`` est mal formé.

    Exemples : ``DocumentRef.id`` dupliqués, chemins relatifs
    ambigus sans racine, GT déclarée pour un niveau non supporté.
    """


class AdapterStepError(PicaronesError):
    """Racine commune des erreurs d'adapter (OCR / LLM / VLM).

    Permet à un caller (typiquement le ``PipelineExecutor``) de
    catcher *« toute erreur d'adapter »* sans avoir à connaître la
    sous-classe spécifique.  Les sous-classes ``OCRAdapterError``,
    ``LLMAdapterError``, ``VLMAdapterError`` héritent toutes de
    ``AdapterStepError``.
    """


__all__ = [
    "PicaronesError",
    "ArtifactValidationError",
    "ProjectionError",
    "CorpusSpecError",
    "AdapterStepError",
]