Coverage for src / beautyspot / types.py: 98%

42 statements  

« prev     ^ index     » next       coverage.py v7.13.2, created at 2026-03-11 19:10 +0900

1# src/beautyspot/types.py 

2 

3from collections.abc import Mapping 

4from dataclasses import dataclass 

5from datetime import datetime 

6from types import MappingProxyType 

7from typing import Any, Optional, TypedDict 

8 

9 

10class TaskRecord(TypedDict): 

11 """ 

12 Task metadata record retrieved from the database. 

13 """ 

14 

15 result_type: str 

16 result_value: Optional[str] 

17 result_data: Optional[bytes] 

18 expires_at: Optional[str] 

19 

20 

21@dataclass(frozen=True) 

22class SaveErrorContext: 

23 """ 

24 キャッシュ保存処理 (wait=False/True) が失敗した際に、 

25 エラーハンドラーへ渡されるコンテキスト情報です。 

26 

27 Attributes: 

28 func_name: キャッシュ保存対象となった関数の名前 

29 cache_key: 生成されたキャッシュキー (SHA-256) 

30 input_id: 入力引数から生成された識別子 

31 version: キャッシュのバージョン指定文字列 

32 content_type: 保存データのMIMEタイプなどのコンテンツタイプ文字列 

33 save_blob: Blobストレージへの保存が指定/判定されていたか 

34 expires_at: 計算されたキャッシュの有効期限 

35 result_type: キャッシュしようとした戻り値の型名 

36 result_size: キャッシュしようとした戻り値のメモリサイズ概算(取得可能な場合のみ) 

37 """ 

38 

39 func_name: str 

40 cache_key: str 

41 input_id: str 

42 version: Optional[str] 

43 content_type: Optional[str] 

44 save_blob: Optional[bool] 

45 expires_at: Optional[datetime] 

46 result_type: str 

47 result_size: Optional[int] 

48 

49 

50@dataclass(frozen=True) 

51class HookContextBase: 

52 """すべてのフックに共通する基本コンテキスト情報。 

53 

54 Attributes: 

55 kwargs: 関数に渡されたキーワード引数。読み取り専用の ``MappingProxyType`` 

56 として提供されるため、フック内での変更はできません。 

57 """ 

58 

59 func_name: str 

60 input_id: str 

61 cache_key: str 

62 args: tuple 

63 kwargs: Mapping[str, Any] 

64 

65 def __post_init__(self) -> None: 

66 # Bug Fix (D4): frozen=True でも dict の内容は変更可能なため、 

67 # MappingProxyType でラップしてフックによる意図しない変更を防ぐ。 

68 if not isinstance(self.kwargs, MappingProxyType): 68 ↛ exitline 68 didn't return from function '__post_init__' because the condition on line 68 was always true

69 object.__setattr__(self, "kwargs", MappingProxyType(self.kwargs)) 

70 

71 

72@dataclass(frozen=True) 

73class PreExecuteContext(HookContextBase): 

74 """関数実行前、またはキャッシュ確認前に渡されるコンテキスト。""" 

75 

76 pass 

77 

78 

79@dataclass(frozen=True) 

80class CacheHitContext(HookContextBase): 

81 """キャッシュから正常に結果が取得された際に渡されるコンテキスト。""" 

82 

83 result: Any 

84 version: Optional[str] 

85 

86 

87@dataclass(frozen=True) 

88class CacheMissContext(HookContextBase): 

89 """キャッシュミスとなり、元の関数が実行された後に渡されるコンテキスト。""" 

90 

91 result: Any 

92 version: Optional[str]