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

47 statements  

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

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

2from abc import ABC, abstractmethod 

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

4from uuid import UUID 

5 

6 

7T = TypeVar('T') 

8 

9 

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

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