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.
- file_hub_client/__init__.py +39 -0
- file_hub_client/client.py +43 -6
- file_hub_client/rpc/async_client.py +91 -11
- file_hub_client/rpc/gen/taple_service_pb2.py +225 -0
- file_hub_client/rpc/gen/taple_service_pb2_grpc.py +1626 -0
- file_hub_client/rpc/generate_grpc.py +2 -2
- file_hub_client/rpc/interceptors.py +550 -0
- file_hub_client/rpc/protos/taple_service.proto +874 -0
- file_hub_client/rpc/sync_client.py +91 -9
- file_hub_client/schemas/__init__.py +60 -0
- file_hub_client/schemas/taple.py +413 -0
- file_hub_client/services/__init__.py +5 -0
- file_hub_client/services/file/async_blob_service.py +558 -482
- file_hub_client/services/file/async_file_service.py +18 -9
- file_hub_client/services/file/base_file_service.py +19 -6
- file_hub_client/services/file/sync_blob_service.py +554 -478
- file_hub_client/services/file/sync_file_service.py +18 -9
- file_hub_client/services/folder/async_folder_service.py +20 -11
- file_hub_client/services/folder/sync_folder_service.py +20 -11
- file_hub_client/services/taple/__init__.py +10 -0
- file_hub_client/services/taple/async_taple_service.py +2281 -0
- file_hub_client/services/taple/base_taple_service.py +353 -0
- file_hub_client/services/taple/idempotent_taple_mixin.py +142 -0
- file_hub_client/services/taple/sync_taple_service.py +2256 -0
- file_hub_client/utils/__init__.py +43 -1
- file_hub_client/utils/file_utils.py +59 -11
- file_hub_client/utils/idempotency.py +196 -0
- file_hub_client/utils/logging.py +315 -0
- file_hub_client/utils/retry.py +241 -2
- file_hub_client/utils/smart_retry.py +403 -0
- tamar_file_hub_client-0.0.2.dist-info/METADATA +2050 -0
- tamar_file_hub_client-0.0.2.dist-info/RECORD +57 -0
- tamar_file_hub_client-0.0.1.dist-info/METADATA +0 -874
- tamar_file_hub_client-0.0.1.dist-info/RECORD +0 -44
- {tamar_file_hub_client-0.0.1.dist-info → tamar_file_hub_client-0.0.2.dist-info}/WHEEL +0 -0
- {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,
|
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,
|
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,
|
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
|
-
|
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,
|
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,
|
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,
|
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
|
-
|
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.
|
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
|
-
|
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,
|
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,
|
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,
|
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
|
-
|
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.
|
196
|
+
folders = [self._convert_folder_info(f) for f in response.folders]
|
188
197
|
|
189
198
|
return FolderListResponse(items=folders)
|
190
199
|
|