Coverage for autocrud/core.py: 71%
80 statements
« prev ^ index » next coverage.py v7.9.2, created at 2025-07-23 23:00 +0800
« prev ^ index » next coverage.py v7.9.2, created at 2025-07-23 23:00 +0800
1"""AutoCRUD 核心模組"""
3import uuid
4from typing import Any, Dict, Type, Optional
5from .converter import ModelConverter
6from .storage import Storage
9class AutoCRUD:
10 """自動 CRUD 系統核心類"""
12 def __init__(
13 self,
14 model: Type,
15 storage: Storage,
16 resource_name: str,
17 id_generator: Optional[callable] = None,
18 ):
19 self.model = model
20 self.storage = storage
21 self.resource_name = resource_name
22 self.converter = ModelConverter()
23 self.id_generator = id_generator or (lambda: str(uuid.uuid4()))
25 # 驗證模型類型
26 self.model_type = self.converter.detect_model_type(model)
27 self.model_fields = self.converter.extract_fields(model)
29 def _make_key(self, resource_id: str) -> str:
30 """生成存儲鍵"""
31 return f"{self.resource_name}:{resource_id}"
33 def create(self, data: Dict[str, Any]) -> Dict[str, Any]:
34 """創建資源"""
35 # 生成 ID
36 resource_id = self.id_generator()
38 # 創建模型實例
39 instance = self.converter.from_dict(self.model, data)
41 # 轉換為字典並添加 ID
42 instance_dict = self.converter.to_dict(instance)
43 instance_dict["id"] = resource_id
45 # 存儲
46 key = self._make_key(resource_id)
47 self.storage.set(key, instance_dict)
49 return instance_dict
51 def get(self, resource_id: str) -> Optional[Dict[str, Any]]:
52 """獲取資源"""
53 key = self._make_key(resource_id)
54 return self.storage.get(key)
56 def update(
57 self, resource_id: str, data: Dict[str, Any]
58 ) -> Optional[Dict[str, Any]]:
59 """更新資源"""
60 key = self._make_key(resource_id)
62 # 檢查資源是否存在
63 if not self.storage.exists(key):
64 return None
66 # 創建模型實例驗證數據
67 instance = self.converter.from_dict(self.model, data)
69 # 轉換為字典並保持 ID
70 instance_dict = self.converter.to_dict(instance)
71 instance_dict["id"] = resource_id
73 # 更新存儲
74 self.storage.set(key, instance_dict)
76 return instance_dict
78 def delete(self, resource_id: str) -> bool:
79 """刪除資源"""
80 key = self._make_key(resource_id)
81 return self.storage.delete(key)
83 def exists(self, resource_id: str) -> bool:
84 """檢查資源是否存在"""
85 key = self._make_key(resource_id)
86 return self.storage.exists(key)
88 def list_all(self) -> Dict[str, Dict[str, Any]]:
89 """列出所有資源"""
90 prefix = f"{self.resource_name}:"
91 all_keys = self.storage.list_keys()
93 result = {}
94 for key in all_keys:
95 if key.startswith(prefix):
96 resource_id = key[len(prefix) :]
97 data = self.storage.get(key)
98 if data:
99 result[resource_id] = data
101 return result
103 def create_fastapi_app(self, **kwargs):
104 """創建 FastAPI 應用的便利方法"""
105 from .fastapi_generator import FastAPIGenerator
107 generator = FastAPIGenerator(self)
108 return generator.create_fastapi_app(**kwargs)
111# 使用範例
112if __name__ == "__main__":
113 from dataclasses import dataclass
114 from .storage import MemoryStorage
116 @dataclass
117 class User:
118 name: str
119 email: str
120 age: int
122 # 創建 AutoCRUD 實例
123 storage = MemoryStorage()
124 crud = AutoCRUD(model=User, storage=storage, resource_name="users")
126 # 測試創建
127 user_data = {"name": "Alice", "email": "alice@example.com", "age": 30}
128 created_user = crud.create(user_data)
129 print(f"創建用戶: {created_user}")
131 # 測試獲取
132 user_id = created_user["id"]
133 retrieved_user = crud.get(user_id)
134 print(f"獲取用戶: {retrieved_user}")
136 # 測試更新
137 updated_data = {
138 "name": "Alice Smith",
139 "email": "alice.smith@example.com",
140 "age": 31,
141 }
142 updated_user = crud.update(user_id, updated_data)
143 print(f"更新用戶: {updated_user}")
145 # 測試列出所有
146 all_users = crud.list_all()
147 print(f"所有用戶: {all_users}")
149 # 測試刪除
150 deleted = crud.delete(user_id)
151 print(f"刪除成功: {deleted}")
152 print(f"刪除後存在: {crud.exists(user_id)}")