tamar-file-hub-client 0.0.1__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 (44) hide show
  1. file_hub_client/__init__.py +88 -0
  2. file_hub_client/client.py +414 -0
  3. file_hub_client/enums/__init__.py +12 -0
  4. file_hub_client/enums/export_format.py +16 -0
  5. file_hub_client/enums/role.py +7 -0
  6. file_hub_client/enums/upload_mode.py +11 -0
  7. file_hub_client/errors/__init__.py +30 -0
  8. file_hub_client/errors/exceptions.py +93 -0
  9. file_hub_client/py.typed +1 -0
  10. file_hub_client/rpc/__init__.py +10 -0
  11. file_hub_client/rpc/async_client.py +312 -0
  12. file_hub_client/rpc/gen/__init__.py +1 -0
  13. file_hub_client/rpc/gen/file_service_pb2.py +74 -0
  14. file_hub_client/rpc/gen/file_service_pb2_grpc.py +533 -0
  15. file_hub_client/rpc/gen/folder_service_pb2.py +53 -0
  16. file_hub_client/rpc/gen/folder_service_pb2_grpc.py +269 -0
  17. file_hub_client/rpc/generate_grpc.py +76 -0
  18. file_hub_client/rpc/protos/file_service.proto +147 -0
  19. file_hub_client/rpc/protos/folder_service.proto +65 -0
  20. file_hub_client/rpc/sync_client.py +313 -0
  21. file_hub_client/schemas/__init__.py +43 -0
  22. file_hub_client/schemas/context.py +160 -0
  23. file_hub_client/schemas/file.py +89 -0
  24. file_hub_client/schemas/folder.py +29 -0
  25. file_hub_client/services/__init__.py +17 -0
  26. file_hub_client/services/file/__init__.py +14 -0
  27. file_hub_client/services/file/async_blob_service.py +482 -0
  28. file_hub_client/services/file/async_file_service.py +257 -0
  29. file_hub_client/services/file/base_file_service.py +103 -0
  30. file_hub_client/services/file/sync_blob_service.py +478 -0
  31. file_hub_client/services/file/sync_file_service.py +255 -0
  32. file_hub_client/services/folder/__init__.py +10 -0
  33. file_hub_client/services/folder/async_folder_service.py +206 -0
  34. file_hub_client/services/folder/sync_folder_service.py +205 -0
  35. file_hub_client/utils/__init__.py +48 -0
  36. file_hub_client/utils/converter.py +108 -0
  37. file_hub_client/utils/download_helper.py +355 -0
  38. file_hub_client/utils/file_utils.py +105 -0
  39. file_hub_client/utils/retry.py +69 -0
  40. file_hub_client/utils/upload_helper.py +527 -0
  41. tamar_file_hub_client-0.0.1.dist-info/METADATA +874 -0
  42. tamar_file_hub_client-0.0.1.dist-info/RECORD +44 -0
  43. tamar_file_hub_client-0.0.1.dist-info/WHEEL +5 -0
  44. tamar_file_hub_client-0.0.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,269 @@
1
+ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
2
+ """Client and server classes corresponding to protobuf-defined services."""
3
+ import grpc
4
+ import warnings
5
+
6
+ import file_hub_client.rpc.gen.folder_service_pb2 as folder__service__pb2
7
+
8
+ GRPC_GENERATED_VERSION = '1.67.1'
9
+ GRPC_VERSION = grpc.__version__
10
+ _version_not_supported = False
11
+
12
+ try:
13
+ from grpc._utilities import first_version_is_lower
14
+ _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION)
15
+ except ImportError:
16
+ _version_not_supported = True
17
+
18
+ if _version_not_supported:
19
+ raise RuntimeError(
20
+ f'The grpc package installed is at version {GRPC_VERSION},'
21
+ + f' but the generated code in folder_service_pb2_grpc.py depends on'
22
+ + f' grpcio>={GRPC_GENERATED_VERSION}.'
23
+ + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}'
24
+ + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.'
25
+ )
26
+
27
+
28
+ class FolderServiceStub(object):
29
+ """Missing associated documentation comment in .proto file."""
30
+
31
+ def __init__(self, channel):
32
+ """Constructor.
33
+
34
+ Args:
35
+ channel: A grpc.Channel.
36
+ """
37
+ self.CreateFolder = channel.unary_unary(
38
+ '/folder.FolderService/CreateFolder',
39
+ request_serializer=folder__service__pb2.CreateFolderRequest.SerializeToString,
40
+ response_deserializer=folder__service__pb2.Folder.FromString,
41
+ _registered_method=True)
42
+ self.RenameFolder = channel.unary_unary(
43
+ '/folder.FolderService/RenameFolder',
44
+ request_serializer=folder__service__pb2.RenameFolderRequest.SerializeToString,
45
+ response_deserializer=folder__service__pb2.Folder.FromString,
46
+ _registered_method=True)
47
+ self.MoveFolder = channel.unary_unary(
48
+ '/folder.FolderService/MoveFolder',
49
+ request_serializer=folder__service__pb2.MoveFolderRequest.SerializeToString,
50
+ response_deserializer=folder__service__pb2.Folder.FromString,
51
+ _registered_method=True)
52
+ self.DeleteFolder = channel.unary_unary(
53
+ '/folder.FolderService/DeleteFolder',
54
+ request_serializer=folder__service__pb2.DeleteFolderRequest.SerializeToString,
55
+ response_deserializer=folder__service__pb2.Empty.FromString,
56
+ _registered_method=True)
57
+ self.ListFolders = channel.unary_unary(
58
+ '/folder.FolderService/ListFolders',
59
+ request_serializer=folder__service__pb2.ListFoldersRequest.SerializeToString,
60
+ response_deserializer=folder__service__pb2.FolderListResponse.FromString,
61
+ _registered_method=True)
62
+
63
+
64
+ class FolderServiceServicer(object):
65
+ """Missing associated documentation comment in .proto file."""
66
+
67
+ def CreateFolder(self, request, context):
68
+ """Missing associated documentation comment in .proto file."""
69
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
70
+ context.set_details('Method not implemented!')
71
+ raise NotImplementedError('Method not implemented!')
72
+
73
+ def RenameFolder(self, request, context):
74
+ """Missing associated documentation comment in .proto file."""
75
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
76
+ context.set_details('Method not implemented!')
77
+ raise NotImplementedError('Method not implemented!')
78
+
79
+ def MoveFolder(self, request, context):
80
+ """Missing associated documentation comment in .proto file."""
81
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
82
+ context.set_details('Method not implemented!')
83
+ raise NotImplementedError('Method not implemented!')
84
+
85
+ def DeleteFolder(self, request, context):
86
+ """Missing associated documentation comment in .proto file."""
87
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
88
+ context.set_details('Method not implemented!')
89
+ raise NotImplementedError('Method not implemented!')
90
+
91
+ def ListFolders(self, request, context):
92
+ """Missing associated documentation comment in .proto file."""
93
+ context.set_code(grpc.StatusCode.UNIMPLEMENTED)
94
+ context.set_details('Method not implemented!')
95
+ raise NotImplementedError('Method not implemented!')
96
+
97
+
98
+ def add_FolderServiceServicer_to_server(servicer, server):
99
+ rpc_method_handlers = {
100
+ 'CreateFolder': grpc.unary_unary_rpc_method_handler(
101
+ servicer.CreateFolder,
102
+ request_deserializer=folder__service__pb2.CreateFolderRequest.FromString,
103
+ response_serializer=folder__service__pb2.Folder.SerializeToString,
104
+ ),
105
+ 'RenameFolder': grpc.unary_unary_rpc_method_handler(
106
+ servicer.RenameFolder,
107
+ request_deserializer=folder__service__pb2.RenameFolderRequest.FromString,
108
+ response_serializer=folder__service__pb2.Folder.SerializeToString,
109
+ ),
110
+ 'MoveFolder': grpc.unary_unary_rpc_method_handler(
111
+ servicer.MoveFolder,
112
+ request_deserializer=folder__service__pb2.MoveFolderRequest.FromString,
113
+ response_serializer=folder__service__pb2.Folder.SerializeToString,
114
+ ),
115
+ 'DeleteFolder': grpc.unary_unary_rpc_method_handler(
116
+ servicer.DeleteFolder,
117
+ request_deserializer=folder__service__pb2.DeleteFolderRequest.FromString,
118
+ response_serializer=folder__service__pb2.Empty.SerializeToString,
119
+ ),
120
+ 'ListFolders': grpc.unary_unary_rpc_method_handler(
121
+ servicer.ListFolders,
122
+ request_deserializer=folder__service__pb2.ListFoldersRequest.FromString,
123
+ response_serializer=folder__service__pb2.FolderListResponse.SerializeToString,
124
+ ),
125
+ }
126
+ generic_handler = grpc.method_handlers_generic_handler(
127
+ 'folder.FolderService', rpc_method_handlers)
128
+ server.add_generic_rpc_handlers((generic_handler,))
129
+ server.add_registered_method_handlers('folder.FolderService', rpc_method_handlers)
130
+
131
+
132
+ # This class is part of an EXPERIMENTAL API.
133
+ class FolderService(object):
134
+ """Missing associated documentation comment in .proto file."""
135
+
136
+ @staticmethod
137
+ def CreateFolder(request,
138
+ target,
139
+ options=(),
140
+ channel_credentials=None,
141
+ call_credentials=None,
142
+ insecure=False,
143
+ compression=None,
144
+ wait_for_ready=None,
145
+ timeout=None,
146
+ metadata=None):
147
+ return grpc.experimental.unary_unary(
148
+ request,
149
+ target,
150
+ '/folder.FolderService/CreateFolder',
151
+ folder__service__pb2.CreateFolderRequest.SerializeToString,
152
+ folder__service__pb2.Folder.FromString,
153
+ options,
154
+ channel_credentials,
155
+ insecure,
156
+ call_credentials,
157
+ compression,
158
+ wait_for_ready,
159
+ timeout,
160
+ metadata,
161
+ _registered_method=True)
162
+
163
+ @staticmethod
164
+ def RenameFolder(request,
165
+ target,
166
+ options=(),
167
+ channel_credentials=None,
168
+ call_credentials=None,
169
+ insecure=False,
170
+ compression=None,
171
+ wait_for_ready=None,
172
+ timeout=None,
173
+ metadata=None):
174
+ return grpc.experimental.unary_unary(
175
+ request,
176
+ target,
177
+ '/folder.FolderService/RenameFolder',
178
+ folder__service__pb2.RenameFolderRequest.SerializeToString,
179
+ folder__service__pb2.Folder.FromString,
180
+ options,
181
+ channel_credentials,
182
+ insecure,
183
+ call_credentials,
184
+ compression,
185
+ wait_for_ready,
186
+ timeout,
187
+ metadata,
188
+ _registered_method=True)
189
+
190
+ @staticmethod
191
+ def MoveFolder(request,
192
+ target,
193
+ options=(),
194
+ channel_credentials=None,
195
+ call_credentials=None,
196
+ insecure=False,
197
+ compression=None,
198
+ wait_for_ready=None,
199
+ timeout=None,
200
+ metadata=None):
201
+ return grpc.experimental.unary_unary(
202
+ request,
203
+ target,
204
+ '/folder.FolderService/MoveFolder',
205
+ folder__service__pb2.MoveFolderRequest.SerializeToString,
206
+ folder__service__pb2.Folder.FromString,
207
+ options,
208
+ channel_credentials,
209
+ insecure,
210
+ call_credentials,
211
+ compression,
212
+ wait_for_ready,
213
+ timeout,
214
+ metadata,
215
+ _registered_method=True)
216
+
217
+ @staticmethod
218
+ def DeleteFolder(request,
219
+ target,
220
+ options=(),
221
+ channel_credentials=None,
222
+ call_credentials=None,
223
+ insecure=False,
224
+ compression=None,
225
+ wait_for_ready=None,
226
+ timeout=None,
227
+ metadata=None):
228
+ return grpc.experimental.unary_unary(
229
+ request,
230
+ target,
231
+ '/folder.FolderService/DeleteFolder',
232
+ folder__service__pb2.DeleteFolderRequest.SerializeToString,
233
+ folder__service__pb2.Empty.FromString,
234
+ options,
235
+ channel_credentials,
236
+ insecure,
237
+ call_credentials,
238
+ compression,
239
+ wait_for_ready,
240
+ timeout,
241
+ metadata,
242
+ _registered_method=True)
243
+
244
+ @staticmethod
245
+ def ListFolders(request,
246
+ target,
247
+ options=(),
248
+ channel_credentials=None,
249
+ call_credentials=None,
250
+ insecure=False,
251
+ compression=None,
252
+ wait_for_ready=None,
253
+ timeout=None,
254
+ metadata=None):
255
+ return grpc.experimental.unary_unary(
256
+ request,
257
+ target,
258
+ '/folder.FolderService/ListFolders',
259
+ folder__service__pb2.ListFoldersRequest.SerializeToString,
260
+ folder__service__pb2.FolderListResponse.FromString,
261
+ options,
262
+ channel_credentials,
263
+ insecure,
264
+ call_credentials,
265
+ compression,
266
+ wait_for_ready,
267
+ timeout,
268
+ metadata,
269
+ _registered_method=True)
@@ -0,0 +1,76 @@
1
+ """
2
+ 生成gRPC Python代码的脚本
3
+ """
4
+ import os
5
+ import subprocess
6
+ from pathlib import Path
7
+
8
+
9
+ def generate_grpc_code():
10
+ """生成gRPC Python代码"""
11
+ # 获取当前脚本所在目录
12
+ current_dir = Path(__file__).parent
13
+ proto_dir = current_dir / "protos"
14
+ gen_dir = current_dir / "gen"
15
+
16
+ # 创建生成目录
17
+ gen_dir.mkdir(exist_ok=True)
18
+
19
+ # 创建__init__.py文件
20
+ (gen_dir / "__init__.py").touch()
21
+
22
+ # 获取所有proto文件
23
+ proto_files = list(proto_dir.glob("*.proto"))
24
+
25
+ for proto_file in proto_files:
26
+ print(f"生成 {proto_file.name} 的Python代码...")
27
+
28
+ # 生成gRPC代码
29
+ cmd = [
30
+ "python", "-m", "grpc_tools.protoc",
31
+ f"-I{proto_dir}",
32
+ f"--python_out={gen_dir}",
33
+ f"--grpc_python_out={gen_dir}",
34
+ str(proto_file)
35
+ ]
36
+
37
+ result = subprocess.run(cmd, capture_output=True, text=True)
38
+
39
+ if result.returncode != 0:
40
+ print(f"错误: {result.stderr}")
41
+ raise RuntimeError(f"生成gRPC代码失败: {result.stderr}")
42
+ else:
43
+ print(f"成功生成 {proto_file.name}")
44
+
45
+ # 修复导入路径
46
+ fix_imports(gen_dir)
47
+
48
+ print("所有gRPC代码生成完成!")
49
+
50
+
51
+ def fix_imports(gen_dir):
52
+ """修复生成的Python文件中的导入路径"""
53
+ for py_file in gen_dir.glob("*_pb2*.py"):
54
+ with open(py_file, "r", encoding="utf-8") as f:
55
+ content = f.read()
56
+
57
+ # 修复导入路径 - 现在有多个proto文件
58
+ for proto_name in ["file_service", "folder_service"]:
59
+ content = content.replace(f"import {proto_name}_pb2", f"from . import {proto_name}_pb2")
60
+
61
+ with open(py_file, "w", encoding="utf-8") as f:
62
+ f.write(content)
63
+
64
+
65
+ def main():
66
+ """命令行入口点"""
67
+ try:
68
+ generate_grpc_code()
69
+ except Exception as e:
70
+ print(f"生成失败: {e}")
71
+ return 1
72
+ return 0
73
+
74
+
75
+ if __name__ == "__main__":
76
+ generate_grpc_code()
@@ -0,0 +1,147 @@
1
+ syntax = "proto3";
2
+
3
+ package file;
4
+
5
+ import "google/protobuf/timestamp.proto";
6
+ import "google/protobuf/struct.proto";
7
+
8
+ // ========= 服务定义 =========
9
+
10
+ service FileService {
11
+ rpc UploadFile (UploadFileRequest) returns (UploadFileResponse);
12
+ rpc GenerateUploadUrl (UploadUrlRequest) returns (UploadUrlResponse);
13
+ rpc GenerateResumableUploadUrl (UploadUrlRequest) returns (UploadUrlResponse);
14
+ rpc ConfirmUploadCompleted (UploadCompletedRequest) returns (Empty);
15
+ rpc GenerateDownloadUrl (DownloadUrlRequest) returns (DownloadUrlResponse);
16
+ rpc GenerateShareLink (ShareLinkRequest) returns (ShareLinkResponse);
17
+ rpc VisitFile (FileVisitRequest) returns (Empty);
18
+ rpc GetFile (GetFileRequest) returns (File);
19
+ rpc RenameFile (RenameFileRequest) returns (File);
20
+ rpc DeleteFile (DeleteFileRequest) returns (Empty);
21
+ rpc ListFiles (ListFilesRequest) returns (FileListResponse);
22
+ }
23
+
24
+ // ========= 数据结构定义 =========
25
+
26
+ message File {
27
+ string id = 1;
28
+ string folder_id = 2;
29
+ string file_name = 3;
30
+ string file_type = 4;
31
+ google.protobuf.Timestamp created_at = 5;
32
+ google.protobuf.Timestamp updated_at = 6;
33
+ }
34
+
35
+ message UploadFile {
36
+ string id = 1;
37
+ string folder_id = 2;
38
+ string file_id = 3;
39
+ string storage_type = 4;
40
+ string stored_name = 5;
41
+ string stored_path = 6;
42
+ string file_name = 7;
43
+ int64 file_size = 8;
44
+ string file_ext = 9;
45
+ string mime_type = 10;
46
+ string status = 11;
47
+ google.protobuf.Timestamp created_at = 12;
48
+ google.protobuf.Timestamp updated_at = 13;
49
+ }
50
+
51
+ // ========= 请求结构 =========
52
+
53
+ message UploadFileRequest {
54
+ optional string folder_id = 1;
55
+ string file_name = 2;
56
+ bytes content = 3;
57
+ string file_type = 4;
58
+ string mime_type = 5;
59
+ optional bool is_temporary = 6;
60
+ optional int32 expire_seconds = 7;
61
+ }
62
+
63
+ message UploadUrlRequest {
64
+ optional string folder_id = 1;
65
+ string file_name = 2;
66
+ string file_type = 3;
67
+ string mime_type = 4;
68
+ int64 file_size = 5;
69
+ string file_hash = 6;
70
+ optional bool is_temporary = 7;
71
+ optional int32 expire_seconds = 8;
72
+ }
73
+
74
+ message UploadCompletedRequest {
75
+ string file_id = 1;
76
+ }
77
+
78
+ message DownloadUrlRequest {
79
+ string file_id = 1;
80
+ optional int32 expire_seconds = 2;
81
+ }
82
+
83
+ message ShareLinkRequest {
84
+ string file_id = 1;
85
+ bool is_public = 2;
86
+ string access_scope = 3;
87
+ optional int32 expire_seconds = 4;
88
+ optional int32 max_access = 5;
89
+ optional string share_password = 6;
90
+ }
91
+
92
+ message FileVisitRequest {
93
+ string file_share_id = 1;
94
+ string access_type = 2;
95
+ int32 access_duration = 3;
96
+ google.protobuf.Struct metadata = 4;
97
+ }
98
+
99
+ message GetFileRequest {
100
+ string file_id = 1;
101
+ }
102
+
103
+ message RenameFileRequest {
104
+ string file_id = 1;
105
+ string new_name = 2;
106
+ }
107
+
108
+ message DeleteFileRequest {
109
+ string file_id = 1;
110
+ }
111
+
112
+ message ListFilesRequest {
113
+ optional string folder_id = 1;
114
+ optional string file_name = 2;
115
+ repeated string file_type = 3;
116
+ optional string created_by_role = 4;
117
+ optional string created_by = 5;
118
+ optional int32 page_size = 6;
119
+ optional int32 page = 7;
120
+ }
121
+
122
+ // ========= 响应结构 =========
123
+
124
+ message UploadFileResponse {
125
+ File file = 1;
126
+ UploadFile upload_file = 2;
127
+ }
128
+
129
+ message UploadUrlResponse {
130
+ File file = 1;
131
+ UploadFile upload_file = 2;
132
+ string url = 3;
133
+ }
134
+
135
+ message DownloadUrlResponse {
136
+ string url = 1;
137
+ }
138
+
139
+ message ShareLinkResponse {
140
+ string file_share_id = 1;
141
+ }
142
+
143
+ message FileListResponse {
144
+ repeated File files = 1;
145
+ }
146
+
147
+ message Empty {}
@@ -0,0 +1,65 @@
1
+ syntax = "proto3";
2
+
3
+ package folder;
4
+
5
+ import "google/protobuf/timestamp.proto";
6
+
7
+ service FolderService {
8
+ rpc CreateFolder (CreateFolderRequest) returns (Folder);
9
+ rpc RenameFolder (RenameFolderRequest) returns (Folder);
10
+ rpc MoveFolder (MoveFolderRequest) returns (Folder);
11
+ rpc DeleteFolder (DeleteFolderRequest) returns (Empty);
12
+ rpc ListFolders (ListFoldersRequest) returns (FolderListResponse);
13
+ }
14
+
15
+ // ========= 数据结构定义 =========
16
+
17
+ message Folder {
18
+ string id = 1;
19
+ string org_id = 2;
20
+ string user_id = 3;
21
+ string folder_name = 4;
22
+ string parent_id = 5;
23
+ string created_by = 6;
24
+ string created_by_role = 7;
25
+ google.protobuf.Timestamp created_at = 8;
26
+ google.protobuf.Timestamp updated_at = 9;
27
+ }
28
+
29
+ // ========= 请求结构 =========
30
+
31
+ message CreateFolderRequest {
32
+ string folder_name = 1;
33
+ optional string parent_id = 2;
34
+ }
35
+
36
+ message RenameFolderRequest {
37
+ string folder_id = 1;
38
+ string new_name = 2;
39
+ }
40
+
41
+ message MoveFolderRequest {
42
+ string folder_id = 1;
43
+ string new_parent_id = 2;
44
+ }
45
+
46
+ message DeleteFolderRequest {
47
+ string folder_id = 1;
48
+ }
49
+
50
+ message ListFoldersRequest {
51
+ optional string parent_id = 1;
52
+ optional string org_id = 2;
53
+ optional string user_id = 3;
54
+ optional string folder_name = 4;
55
+ optional string created_by_role = 5;
56
+ optional string created_by = 6;
57
+ }
58
+
59
+ // ========= 响应结构 =========
60
+
61
+ message FolderListResponse {
62
+ repeated Folder folders = 1;
63
+ }
64
+
65
+ message Empty {}