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
« 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
6from pydantic import BaseModel, Field, ConfigDict
9class BaseEntity(BaseModel):
10 """全エンティティの基底クラス"""
12 model_config = ConfigDict(
13 # JSON互換性
14 json_encoders={datetime: lambda v: v.isoformat()},
15 # バリデーション設定
16 validate_assignment=True,
17 # 追加フィールドを許可しない
18 extra='forbid',
19 )
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="更新日時")
25 def mark_updated(self) -> None:
26 """更新日時を記録"""
27 self.updated_at = datetime.now()
30class Neo4jNode(BaseEntity):
31 """Neo4jノードの基底クラス"""
33 @property
34 def neo4j_labels(self) -> list[str]:
35 """Neo4jラベルのリスト"""
36 return [self.__class__.__name__]
38 @property
39 def neo4j_properties(self) -> dict:
40 """Neo4jプロパティの辞書"""
41 return self.model_dump(exclude={'id'})
44class Neo4jRelationship(BaseModel):
45 """Neo4jリレーションシップの基底クラス"""
47 model_config = ConfigDict(
48 validate_assignment=True,
49 extra='forbid',
50 )
52 @property
53 def neo4j_type(self) -> str:
54 """Neo4jリレーションシップタイプ"""
55 return self.__class__.__name__.upper()
57 @property
58 def neo4j_properties(self) -> dict:
59 """Neo4jプロパティの辞書"""
60 return self.model_dump()