Coverage for src/inheritance_calculator_core/models/base.py: 85%

1"""ベースモデルクラス"""

2 from datetime import datetime

3 from typing import Optional

4 from uuid import UUID, uuid4

5

6 from pydantic import BaseModel, Field, ConfigDict

7

8

9 class BaseEntity(BaseModel):

10 """全エンティティの基底クラス"""

11

12 model_config = ConfigDict(

13 # JSON互換性

14 json_encoders={datetime: lambda v: v.isoformat()},

15 # バリデーション設定

16 validate_assignment=True,

17 # 追加フィールドを許可しない

18 extra='forbid',

19 )

20

21 id: UUID = Field(default_factory=uuid4, description="エンティティID")

22 created_at: datetime = Field(default_factory=datetime.now, description="作成日時")

23 updated_at: Optional[datetime] = Field(default=None, description="更新日時")

24

25 def mark_updated(self) -> None:

26 """更新日時を記録"""

27 self.updated_at = datetime.now()

28

29

30 class Neo4jNode(BaseEntity):

31 """Neo4jノードの基底クラス"""

32

33 @property

34 def neo4j_labels(self) -> list[str]:

35 """Neo4jラベルのリスト"""

36 return [self.__class__.__name__]

37

38 @property

39 def neo4j_properties(self) -> dict:

40 """Neo4jプロパティの辞書"""

41 return self.model_dump(exclude={'id'})

42

43

44 class Neo4jRelationship(BaseModel):

45 """Neo4jリレーションシップの基底クラス"""

46

47 model_config = ConfigDict(

48 validate_assignment=True,

49 extra='forbid',

50 )

51

52 @property

53 def neo4j_type(self) -> str:

54 """Neo4jリレーションシップタイプ"""

55 return self.__class__.__name__.upper()

56

57 @property

58 def neo4j_properties(self) -> dict:

59 """Neo4jプロパティの辞書"""

60 return self.model_dump()