Coverage for src/inheritance_calculator_core/database/base.py: 0%

1"""データベース層の基底クラスとインターフェース"""

2 from abc import ABC, abstractmethod

3 from typing import Generic, TypeVar, Optional, List, Any

4 from uuid import UUID

5

6

7 T = TypeVar('T')

8

9

10 class Repository(ABC, Generic[T]):

11 """リポジトリパターンの基底クラス"""

12

13 @abstractmethod

14 async def create(self, entity: T) -> T:

15 """

16 エンティティを作成

17

18 Args:

19 entity: 作成するエンティティ

20

21 Returns:

22 作成されたエンティティ

23

24 Raises:

25 DatabaseConnectionError: データベース接続エラー

26 ValidationError: バリデーションエラー

27 """

28 pass

29

30 @abstractmethod

31 async def get_by_id(self, entity_id: UUID) -> Optional[T]:

32 """

33 IDでエンティティを取得

34

35 Args:

36 entity_id: エンティティID

37

38 Returns:

39 エンティティ（存在しない場合はNone）

40

41 Raises:

42 DatabaseConnectionError: データベース接続エラー

43 """

44 pass

45

46 @abstractmethod

47 async def update(self, entity: T) -> T:

48 """

49 エンティティを更新

50

51 Args:

52 entity: 更新するエンティティ

53

54 Returns:

55 更新されたエンティティ

56

57 Raises:

58 DatabaseConnectionError: データベース接続エラー

59 ValidationError: バリデーションエラー

60 """

61 pass

62

63 @abstractmethod

64 async def delete(self, entity_id: UUID) -> bool:

65 """

66 エンティティを削除

67

68 Args:

69 entity_id: エンティティID

70

71 Returns:

72 削除成功の場合True

73

74 Raises:

75 DatabaseConnectionError: データベース接続エラー

76 """

77 pass

78

79 @abstractmethod

80 async def list_all(self, limit: Optional[int] = None, offset: int = 0) -> List[T]:

81 """

82 全エンティティを取得

83

84 Args:

85 limit: 取得件数制限

86 offset: 取得開始位置

87

88 Returns:

89 エンティティのリスト

90

91 Raises:

92 DatabaseConnectionError: データベース接続エラー

93 """

94 pass

95

96

97 class DatabaseClient(ABC):

98 """データベースクライアントの基底クラス（同期版）

99

100 Note:

101 現在の実装ではNeo4jの同期ドライバーを使用しているため、

102 すべてのメソッドは同期版として定義されています。

103 将来的に非同期対応が必要になった場合は、

104 AsyncDatabaseClientクラスを別途定義することを推奨します。

105 """

106

107 @abstractmethod

108 def connect(self) -> None:

109 """

110 データベースに接続

111

112 Raises:

113 DatabaseConnectionError: 接続エラー

114 """

115 pass

116

117 @abstractmethod

118 def disconnect(self) -> None:

119 """

120 データベース接続を切断

121

122 Raises:

123 DatabaseConnectionError: 切断エラー

124 """

125 pass

126

127 @abstractmethod

128 def execute_query(

129 self,

130 query: str,

131 parameters: Optional[dict[str, Any]] = None

132 ) -> Any:

133 """

134 クエリを実行

135

136 Args:

137 query: 実行するクエリ

138 parameters: クエリパラメータ

139

140 Returns:

141 クエリ実行結果

142

143 Raises:

144 DatabaseConnectionError: 実行エラー

145 """

146 pass

147

148 @abstractmethod

149 def health_check(self) -> bool:

150 """

151 ヘルスチェック

152

153 Returns:

154 正常な場合True

155

156 Raises:

157 DatabaseConnectionError: 接続エラー

158 """

159 pass

160

161 @abstractmethod

162 def begin_transaction(self) -> Any:

163 """

164 トランザクションを開始

165

166 Returns:

167 トランザクションオブジェクト

168

169 Raises:

170 DatabaseConnectionError: トランザクション開始エラー

171 """

172 pass

173

174 @abstractmethod

175 def commit_transaction(self, transaction: Any) -> None:

176 """

177 トランザクションをコミット

178

179 Args:

180 transaction: トランザクションオブジェクト

181

182 Raises:

183 DatabaseConnectionError: コミットエラー

184 """

185 pass

186

187 @abstractmethod

188 def rollback_transaction(self, transaction: Any) -> None:

189 """

190 トランザクションをロールバック

191

192 Args:

193 transaction: トランザクションオブジェクト

194

195 Raises:

196 DatabaseConnectionError: ロールバックエラー

197 """

198 pass

199

200 def __enter__(self) -> "DatabaseClient":

201 """コンテキストマネージャーの開始"""

202 self.connect()

203 return self

204

205 def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:

206 """コンテキストマネージャーの終了"""

207 self.disconnect()