tamar-file-hub-client 0.0.1__py3-none-any.whl → 0.0.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. file_hub_client/__init__.py +39 -0
  2. file_hub_client/client.py +43 -6
  3. file_hub_client/rpc/async_client.py +91 -11
  4. file_hub_client/rpc/gen/taple_service_pb2.py +225 -0
  5. file_hub_client/rpc/gen/taple_service_pb2_grpc.py +1626 -0
  6. file_hub_client/rpc/generate_grpc.py +2 -2
  7. file_hub_client/rpc/interceptors.py +550 -0
  8. file_hub_client/rpc/protos/taple_service.proto +874 -0
  9. file_hub_client/rpc/sync_client.py +91 -9
  10. file_hub_client/schemas/__init__.py +60 -0
  11. file_hub_client/schemas/taple.py +413 -0
  12. file_hub_client/services/__init__.py +5 -0
  13. file_hub_client/services/file/async_blob_service.py +558 -482
  14. file_hub_client/services/file/async_file_service.py +18 -9
  15. file_hub_client/services/file/base_file_service.py +19 -6
  16. file_hub_client/services/file/sync_blob_service.py +554 -478
  17. file_hub_client/services/file/sync_file_service.py +18 -9
  18. file_hub_client/services/folder/async_folder_service.py +20 -11
  19. file_hub_client/services/folder/sync_folder_service.py +20 -11
  20. file_hub_client/services/taple/__init__.py +10 -0
  21. file_hub_client/services/taple/async_taple_service.py +2281 -0
  22. file_hub_client/services/taple/base_taple_service.py +353 -0
  23. file_hub_client/services/taple/idempotent_taple_mixin.py +142 -0
  24. file_hub_client/services/taple/sync_taple_service.py +2256 -0
  25. file_hub_client/utils/__init__.py +43 -1
  26. file_hub_client/utils/file_utils.py +59 -11
  27. file_hub_client/utils/idempotency.py +196 -0
  28. file_hub_client/utils/logging.py +315 -0
  29. file_hub_client/utils/retry.py +241 -2
  30. file_hub_client/utils/smart_retry.py +403 -0
  31. tamar_file_hub_client-0.0.2.dist-info/METADATA +2050 -0
  32. tamar_file_hub_client-0.0.2.dist-info/RECORD +57 -0
  33. tamar_file_hub_client-0.0.1.dist-info/METADATA +0 -874
  34. tamar_file_hub_client-0.0.1.dist-info/RECORD +0 -44
  35. {tamar_file_hub_client-0.0.1.dist-info → tamar_file_hub_client-0.0.2.dist-info}/WHEEL +0 -0
  36. {tamar_file_hub_client-0.0.1.dist-info → tamar_file_hub_client-0.0.2.dist-info}/top_level.txt +0 -0
@@ -34,6 +34,7 @@ class SyncFileService(BaseFileService):
34
34
  expire_seconds: int = 86400,
35
35
  max_access: Optional[int] = None,
36
36
  share_password: Optional[str] = None,
37
+ request_id: Optional[str] = None,
37
38
  **metadata
38
39
  ) -> str:
39
40
  """
@@ -68,7 +69,7 @@ class SyncFileService(BaseFileService):
68
69
  request.share_password = share_password
69
70
 
70
71
  # 构建元数据
71
- grpc_metadata = self.client.build_metadata(**metadata)
72
+ grpc_metadata = self.client.build_metadata(request_id=request_id, **metadata)
72
73
 
73
74
  response = stub.GenerateShareLink(request, metadata=grpc_metadata)
74
75
 
@@ -80,6 +81,7 @@ class SyncFileService(BaseFileService):
80
81
  access_type: str = "view",
81
82
  access_duration: int = 0,
82
83
  metadata: Optional[Dict[str, Any]] = None,
84
+ request_id: Optional[str] = None,
83
85
  **extra_metadata
84
86
  ) -> None:
85
87
  """
@@ -111,11 +113,12 @@ class SyncFileService(BaseFileService):
111
113
  )
112
114
 
113
115
  # 构建元数据
114
- grpc_metadata = self.client.build_metadata(**extra_metadata)
116
+ grpc_metadata = self.client.build_metadata(request_id=request_id, **extra_metadata)
115
117
 
116
118
  stub.VisitFile(request, metadata=grpc_metadata)
117
119
 
118
- def get_file(self, file_id: str, **metadata) -> File:
120
+ def get_file(self, file_id: str, request_id: Optional[str] = None,
121
+ **metadata) -> File:
119
122
  """
120
123
  获取文件信息
121
124
 
@@ -133,7 +136,7 @@ class SyncFileService(BaseFileService):
133
136
  request = file_service_pb2.GetFileRequest(file_id=file_id)
134
137
 
135
138
  # 构建元数据
136
- grpc_metadata = self.client.build_metadata(**metadata)
139
+ grpc_metadata = self.client.build_metadata(request_id=request_id, **metadata)
137
140
 
138
141
  try:
139
142
  response = stub.GetFile(request, metadata=grpc_metadata)
@@ -143,13 +146,15 @@ class SyncFileService(BaseFileService):
143
146
  raise FileNotFoundError(file_id)
144
147
  raise
145
148
 
146
- def rename_file(self, file_id: str, new_name: str, **metadata) -> File:
149
+ def rename_file(self, file_id: str, new_name: str, request_id: Optional[str] = None,
150
+ **metadata) -> File:
147
151
  """
148
152
  重命名文件
149
153
 
150
154
  Args:
151
155
  file_id: 文件ID
152
156
  new_name: 新文件名
157
+ request_id: 请求ID(可选,如果不提供则自动生成)
153
158
  **metadata: 额外的元数据(如 x-org-id, x-user-id 等)
154
159
 
155
160
  Returns:
@@ -165,7 +170,7 @@ class SyncFileService(BaseFileService):
165
170
  )
166
171
 
167
172
  # 构建元数据
168
- grpc_metadata = self.client.build_metadata(**metadata)
173
+ grpc_metadata = self.client.build_metadata(request_id=request_id, **metadata)
169
174
 
170
175
  try:
171
176
  response = stub.RenameFile(request, metadata=grpc_metadata)
@@ -175,12 +180,14 @@ class SyncFileService(BaseFileService):
175
180
  raise FileNotFoundError(file_id)
176
181
  raise
177
182
 
178
- def delete_file(self, file_id: str, **metadata) -> None:
183
+ def delete_file(self, file_id: str, request_id: Optional[str] = None,
184
+ **metadata) -> None:
179
185
  """
180
186
  删除文件
181
187
 
182
188
  Args:
183
189
  file_id: 文件ID
190
+ request_id: 请求ID(可选,如果不提供则自动生成)
184
191
  **metadata: 额外的元数据(如 x-org-id, x-user-id 等)
185
192
  """
186
193
  from ...rpc.gen import file_service_pb2, file_service_pb2_grpc
@@ -190,7 +197,7 @@ class SyncFileService(BaseFileService):
190
197
  request = file_service_pb2.DeleteFileRequest(file_id=file_id)
191
198
 
192
199
  # 构建元数据
193
- grpc_metadata = self.client.build_metadata(**metadata)
200
+ grpc_metadata = self.client.build_metadata(request_id=request_id, **metadata)
194
201
 
195
202
  try:
196
203
  stub.DeleteFile(request, metadata=grpc_metadata)
@@ -208,6 +215,7 @@ class SyncFileService(BaseFileService):
208
215
  created_by: Optional[str] = None,
209
216
  page_size: int = 20,
210
217
  page: int = 1,
218
+ request_id: Optional[str] = None,
211
219
  **metadata
212
220
  ) -> FileListResponse:
213
221
  """
@@ -221,6 +229,7 @@ class SyncFileService(BaseFileService):
221
229
  created_by: 创建者过滤
222
230
  page_size: 每页大小
223
231
  page: 页码
232
+ request_id: 请求ID(可选,如果不提供则自动生成)
224
233
  **metadata: 额外的元数据(如 x-org-id, x-user-id 等)
225
234
 
226
235
  Returns:
@@ -246,7 +255,7 @@ class SyncFileService(BaseFileService):
246
255
  request.created_by = created_by
247
256
 
248
257
  # 构建元数据
249
- grpc_metadata = self.client.build_metadata(**metadata)
258
+ grpc_metadata = self.client.build_metadata(request_id=request_id, **metadata)
250
259
 
251
260
  response = stub.ListFiles(request, metadata=grpc_metadata)
252
261
 
@@ -31,7 +31,8 @@ class AsyncFolderService:
31
31
  folder_name: str,
32
32
  *,
33
33
  parent_id: Optional[str] = None,
34
- **metadata
34
+ request_id: Optional[str] = None,
35
+ **metadata
35
36
  ) -> FolderInfo:
36
37
  """
37
38
  创建文件夹
@@ -54,18 +55,20 @@ class AsyncFolderService:
54
55
  )
55
56
 
56
57
  # 构建元数据
57
- grpc_metadata = self.client.build_metadata(**metadata)
58
+ grpc_metadata = self.client.build_metadata(request_id=request_id, **metadata)
58
59
 
59
60
  response = await stub.CreateFolder(request, metadata=grpc_metadata)
60
61
  return self._convert_folder_info(response)
61
62
 
62
- async def rename_folder(self, folder_id: str, new_name: str, **metadata) -> FolderInfo:
63
+ async def rename_folder(self, folder_id: str, new_name: str, request_id: Optional[str] = None,
64
+ **metadata) -> FolderInfo:
63
65
  """
64
66
  重命名文件夹
65
67
 
66
68
  Args:
67
69
  folder_id: 文件夹ID
68
70
  new_name: 新名称
71
+ request_id: 请求ID(可选,如果不提供则自动生成)
69
72
  **metadata: 额外的元数据(如 x-org-id, x-user-id 等)
70
73
  """
71
74
  from ...rpc.gen import folder_service_pb2, folder_service_pb2_grpc
@@ -81,7 +84,7 @@ class AsyncFolderService:
81
84
  )
82
85
 
83
86
  # 构建元数据
84
- grpc_metadata = self.client.build_metadata(**metadata)
87
+ grpc_metadata = self.client.build_metadata(request_id=request_id, **metadata)
85
88
 
86
89
  try:
87
90
  response = await stub.RenameFolder(request, metadata=grpc_metadata)
@@ -91,13 +94,15 @@ class AsyncFolderService:
91
94
  raise FolderNotFoundError(folder_id)
92
95
  raise
93
96
 
94
- async def move_folder(self, folder_id: str, new_parent_id: str, **metadata) -> FolderInfo:
97
+ async def move_folder(self, folder_id: str, new_parent_id: str, request_id: Optional[str] = None,
98
+ **metadata) -> FolderInfo:
95
99
  """
96
100
  移动文件夹
97
101
 
98
102
  Args:
99
103
  folder_id: 文件夹ID
100
104
  new_parent_id: 新父文件夹ID
105
+ request_id: 请求ID(可选,如果不提供则自动生成)
101
106
  **metadata: 额外的元数据(如 x-org-id, x-user-id 等)
102
107
  """
103
108
  from ...rpc.gen import folder_service_pb2, folder_service_pb2_grpc
@@ -110,7 +115,7 @@ class AsyncFolderService:
110
115
  )
111
116
 
112
117
  # 构建元数据
113
- grpc_metadata = self.client.build_metadata(**metadata)
118
+ grpc_metadata = self.client.build_metadata(request_id=request_id, **metadata)
114
119
 
115
120
  try:
116
121
  response = await stub.MoveFolder(request, metadata=grpc_metadata)
@@ -120,12 +125,14 @@ class AsyncFolderService:
120
125
  raise FolderNotFoundError(folder_id)
121
126
  raise
122
127
 
123
- async def delete_folder(self, folder_id: str, **metadata) -> None:
128
+ async def delete_folder(self, folder_id: str, request_id: Optional[str] = None,
129
+ **metadata) -> None:
124
130
  """
125
131
  删除文件夹
126
132
 
127
133
  Args:
128
134
  folder_id: 文件夹ID
135
+ request_id: 请求ID(可选,如果不提供则自动生成)
129
136
  **metadata: 额外的元数据(如 x-org-id, x-user-id 等)
130
137
  """
131
138
  from ...rpc.gen import folder_service_pb2, folder_service_pb2_grpc
@@ -135,7 +142,7 @@ class AsyncFolderService:
135
142
  request = folder_service_pb2.DeleteFolderRequest(folder_id=folder_id)
136
143
 
137
144
  # 构建元数据
138
- grpc_metadata = self.client.build_metadata(**metadata)
145
+ grpc_metadata = self.client.build_metadata(request_id=request_id, **metadata)
139
146
 
140
147
  try:
141
148
  await stub.DeleteFolder(request, metadata=grpc_metadata)
@@ -150,7 +157,8 @@ class AsyncFolderService:
150
157
  folder_name: Optional[str] = None,
151
158
  created_by_role: Optional[str] = None,
152
159
  created_by: Optional[str] = None,
153
- **metadata
160
+ request_id: Optional[str] = None,
161
+ **metadata
154
162
  ) -> FolderListResponse:
155
163
  """
156
164
  列出文件夹
@@ -160,6 +168,7 @@ class AsyncFolderService:
160
168
  folder_name: 文件夹名称
161
169
  created_by_role: 创建者角色
162
170
  created_by: 创建者
171
+ request_id: 请求ID(可选,如果不提供则自动生成)
163
172
  **metadata: 额外的元数据(如 x-org-id, x-user-id 等)
164
173
 
165
174
  Returns:
@@ -181,11 +190,11 @@ class AsyncFolderService:
181
190
  request.created_by = created_by
182
191
 
183
192
  # 构建元数据
184
- grpc_metadata = self.client.build_metadata(**metadata)
193
+ grpc_metadata = self.client.build_metadata(request_id=request_id, **metadata)
185
194
 
186
195
  response = await stub.ListFolders(request, metadata=grpc_metadata)
187
196
 
188
- folders = [self._convert_folder_info(f) for f in response.items]
197
+ folders = [self._convert_folder_info(f) for f in response.folders]
189
198
 
190
199
  return FolderListResponse(items=folders)
191
200
 
@@ -30,7 +30,8 @@ class SyncFolderService:
30
30
  self,
31
31
  folder_name: str,
32
32
  parent_id: str,
33
- **metadata
33
+ request_id: Optional[str] = None,
34
+ **metadata
34
35
  ) -> FolderInfo:
35
36
  """
36
37
  创建文件夹
@@ -53,18 +54,20 @@ class SyncFolderService:
53
54
  )
54
55
 
55
56
  # 构建元数据
56
- grpc_metadata = self.client.build_metadata(**metadata)
57
+ grpc_metadata = self.client.build_metadata(request_id=request_id, **metadata)
57
58
 
58
59
  response = stub.CreateFolder(request, metadata=grpc_metadata)
59
60
  return self._convert_folder_info(response)
60
61
 
61
- def rename_folder(self, folder_id: str, new_name: str, **metadata) -> FolderInfo:
62
+ def rename_folder(self, folder_id: str, new_name: str, request_id: Optional[str] = None,
63
+ **metadata) -> FolderInfo:
62
64
  """
63
65
  重命名文件夹
64
66
 
65
67
  Args:
66
68
  folder_id: 文件夹ID
67
69
  new_name: 新名称
70
+ request_id: 请求ID(可选,如果不提供则自动生成)
68
71
  **metadata: 额外的元数据(如 x-org-id, x-user-id 等)
69
72
  """
70
73
  from ...rpc.gen import folder_service_pb2, folder_service_pb2_grpc
@@ -80,7 +83,7 @@ class SyncFolderService:
80
83
  )
81
84
 
82
85
  # 构建元数据
83
- grpc_metadata = self.client.build_metadata(**metadata)
86
+ grpc_metadata = self.client.build_metadata(request_id=request_id, **metadata)
84
87
 
85
88
  try:
86
89
  response = stub.RenameFolder(request, metadata=grpc_metadata)
@@ -90,13 +93,15 @@ class SyncFolderService:
90
93
  raise FolderNotFoundError(folder_id)
91
94
  raise
92
95
 
93
- def move_folder(self, folder_id: str, new_parent_id: str, **metadata) -> FolderInfo:
96
+ def move_folder(self, folder_id: str, new_parent_id: str, request_id: Optional[str] = None,
97
+ **metadata) -> FolderInfo:
94
98
  """
95
99
  移动文件夹
96
100
 
97
101
  Args:
98
102
  folder_id: 文件夹ID
99
103
  new_parent_id: 新父文件夹ID
104
+ request_id: 请求ID(可选,如果不提供则自动生成)
100
105
  **metadata: 额外的元数据(如 x-org-id, x-user-id 等)
101
106
  """
102
107
  from ...rpc.gen import folder_service_pb2, folder_service_pb2_grpc
@@ -109,7 +114,7 @@ class SyncFolderService:
109
114
  )
110
115
 
111
116
  # 构建元数据
112
- grpc_metadata = self.client.build_metadata(**metadata)
117
+ grpc_metadata = self.client.build_metadata(request_id=request_id, **metadata)
113
118
 
114
119
  try:
115
120
  response = stub.MoveFolder(request, metadata=grpc_metadata)
@@ -119,12 +124,14 @@ class SyncFolderService:
119
124
  raise FolderNotFoundError(folder_id)
120
125
  raise
121
126
 
122
- def delete_folder(self, folder_id: str, **metadata) -> None:
127
+ def delete_folder(self, folder_id: str, request_id: Optional[str] = None,
128
+ **metadata) -> None:
123
129
  """
124
130
  删除文件夹
125
131
 
126
132
  Args:
127
133
  folder_id: 文件夹ID
134
+ request_id: 请求ID(可选,如果不提供则自动生成)
128
135
  **metadata: 额外的元数据(如 x-org-id, x-user-id 等)
129
136
  """
130
137
  from ...rpc.gen import folder_service_pb2, folder_service_pb2_grpc
@@ -134,7 +141,7 @@ class SyncFolderService:
134
141
  request = folder_service_pb2.DeleteFolderRequest(folder_id=folder_id)
135
142
 
136
143
  # 构建元数据
137
- grpc_metadata = self.client.build_metadata(**metadata)
144
+ grpc_metadata = self.client.build_metadata(request_id=request_id, **metadata)
138
145
 
139
146
  try:
140
147
  stub.DeleteFolder(request, metadata=grpc_metadata)
@@ -149,7 +156,8 @@ class SyncFolderService:
149
156
  folder_name: Optional[str] = None,
150
157
  created_by_role: Optional[str] = None,
151
158
  created_by: Optional[str] = None,
152
- **metadata
159
+ request_id: Optional[str] = None,
160
+ **metadata
153
161
  ) -> FolderListResponse:
154
162
  """
155
163
  列出文件夹
@@ -159,6 +167,7 @@ class SyncFolderService:
159
167
  folder_name: 文件夹名称
160
168
  created_by_role: 创建者角色
161
169
  created_by: 创建者
170
+ request_id: 请求ID(可选,如果不提供则自动生成)
162
171
  **metadata: 额外的元数据(如 x-org-id, x-user-id 等)
163
172
 
164
173
  Returns:
@@ -180,11 +189,11 @@ class SyncFolderService:
180
189
  request.created_by = created_by
181
190
 
182
191
  # 构建元数据
183
- grpc_metadata = self.client.build_metadata(**metadata)
192
+ grpc_metadata = self.client.build_metadata(request_id=request_id, **metadata)
184
193
 
185
194
  response = stub.ListFolders(request, metadata=grpc_metadata)
186
195
 
187
- folders = [self._convert_folder_info(f) for f in response.items]
196
+ folders = [self._convert_folder_info(f) for f in response.folders]
188
197
 
189
198
  return FolderListResponse(items=folders)
190
199
 
@@ -0,0 +1,10 @@
1
+ """
2
+ Taple 服务模块
3
+ """
4
+ from .async_taple_service import AsyncTapleService
5
+ from .sync_taple_service import SyncTapleService
6
+
7
+ __all__ = [
8
+ "AsyncTapleService",
9
+ "SyncTapleService",
10
+ ]