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

1# src/beautyspot/types.py

2

3 from collections.abc import Mapping

4 from dataclasses import dataclass

5 from datetime import datetime

6 from types import MappingProxyType

7 from typing import Any, Optional, TypedDict

8

9

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

22 class 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)

51 class 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)

73 class PreExecuteContext(HookContextBase):

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

75

76 pass

77

78

79@dataclass(frozen=True)

80 class CacheHitContext(HookContextBase):

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

82

83 result: Any

84 version: Optional[str]

85

86

87@dataclass(frozen=True)

88 class CacheMissContext(HookContextBase):

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

90

91 result: Any

92 version: Optional[str]