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

26 statements  

« prev     ^ index     » next       coverage.py v7.11.0, created at 2025-10-17 05:31 +0900

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

2from datetime import datetime 

3from typing import Optional 

4from uuid import UUID, uuid4 

5 

6from pydantic import BaseModel, Field, ConfigDict 

7 

8 

9class 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 

30class 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 

44class 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()