Coverage for arclith / adapters / input / schemas / base_schema.py: 100%

21 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-03-25 15:02 +0100

1from datetime import datetime 

2from pydantic import BaseModel, ConfigDict, Field, field_validator 

3from uuid import UUID as StdUUID 

4from uuid6 import UUID 

5 

6 

7class BaseSchema(BaseModel): 

8 model_config = ConfigDict(from_attributes=True) 

9 

10 uuid: StdUUID = Field( 

11 description="Identifiant unique de l'entité (UUIDv7, ordonné dans le temps).", 

12 examples=["01951234-5678-7abc-def0-123456789abc"], 

13 ) 

14 created_at: datetime = Field( 

15 description="Date et heure de création de l'entité (UTC).", 

16 examples=["2026-03-17T10:00:00+00:00"], 

17 ) 

18 created_by: str | None = Field( 

19 default=None, 

20 description="Identifiant de l'auteur de la création (utilisateur, service…).", 

21 examples=["user_01951234", None], 

22 ) 

23 updated_at: datetime = Field( 

24 description="Date et heure de la dernière modification (UTC).", 

25 examples=["2026-03-17T12:30:00+00:00"], 

26 ) 

27 updated_by: str | None = Field( 

28 default=None, 

29 description="Identifiant de l'auteur de la dernière modification.", 

30 examples=["user_01951234", None], 

31 ) 

32 deleted_at: datetime | None = Field( 

33 default=None, 

34 description="Date et heure de suppression logique (None si l'entité est active).", 

35 examples=["2026-03-17T18:00:00+00:00", None], 

36 ) 

37 deleted_by: str | None = Field( 

38 default=None, 

39 description="Identifiant de l'auteur de la suppression logique.", 

40 examples=["user_01951234", None], 

41 ) 

42 is_deleted: bool = Field( 

43 default=False, 

44 description="True si l'entité a été supprimée logiquement.", 

45 examples=[False, True], 

46 ) 

47 version: int = Field( 

48 default=1, 

49 description="Numéro de version incrémenté à chaque modification (optimistic locking).", 

50 examples=[1, 5], 

51 ) 

52 

53 @field_validator("uuid", mode="before") 

54 @classmethod 

55 def coerce_uuid(cls, v: object) -> StdUUID: 

56 if isinstance(v, UUID): 

57 return StdUUID(str(v)) 

58 return v # type: ignore[return-value]