google-genai 1.33.0__py3-none-any.whl → 1.53.0__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.
google/genai/files.py CHANGED
@@ -18,13 +18,13 @@
18
18
  import io
19
19
  import json
20
20
  import logging
21
- import mimetypes
22
21
  import os
23
22
  from typing import Any, Optional, Union
24
23
  from urllib.parse import urlencode
25
24
 
26
25
  from . import _api_module
27
26
  from . import _common
27
+ from . import _extra_utils
28
28
  from . import _transformers as t
29
29
  from . import types
30
30
  from ._common import get_value_by_path as getv
@@ -35,128 +35,53 @@ from .pagers import AsyncPager, Pager
35
35
  logger = logging.getLogger('google_genai.files')
36
36
 
37
37
 
38
- def _ListFilesConfig_to_mldev(
38
+ def _CreateFileParameters_to_mldev(
39
39
  from_object: Union[dict[str, Any], object],
40
40
  parent_object: Optional[dict[str, Any]] = None,
41
41
  ) -> dict[str, Any]:
42
42
  to_object: dict[str, Any] = {}
43
-
44
- if getv(from_object, ['page_size']) is not None:
45
- setv(
46
- parent_object, ['_query', 'pageSize'], getv(from_object, ['page_size'])
47
- )
48
-
49
- if getv(from_object, ['page_token']) is not None:
50
- setv(
51
- parent_object,
52
- ['_query', 'pageToken'],
53
- getv(from_object, ['page_token']),
54
- )
43
+ if getv(from_object, ['file']) is not None:
44
+ setv(to_object, ['file'], getv(from_object, ['file']))
55
45
 
56
46
  return to_object
57
47
 
58
48
 
59
- def _ListFilesParameters_to_mldev(
49
+ def _CreateFileResponse_from_mldev(
60
50
  from_object: Union[dict[str, Any], object],
61
51
  parent_object: Optional[dict[str, Any]] = None,
62
52
  ) -> dict[str, Any]:
63
53
  to_object: dict[str, Any] = {}
64
- if getv(from_object, ['config']) is not None:
54
+ if getv(from_object, ['sdkHttpResponse']) is not None:
65
55
  setv(
66
- to_object,
67
- ['config'],
68
- _ListFilesConfig_to_mldev(getv(from_object, ['config']), to_object),
56
+ to_object, ['sdk_http_response'], getv(from_object, ['sdkHttpResponse'])
69
57
  )
70
58
 
71
59
  return to_object
72
60
 
73
61
 
74
- def _FileStatus_to_mldev(
75
- from_object: Union[dict[str, Any], object],
76
- parent_object: Optional[dict[str, Any]] = None,
77
- ) -> dict[str, Any]:
78
- to_object: dict[str, Any] = {}
79
- if getv(from_object, ['details']) is not None:
80
- setv(to_object, ['details'], getv(from_object, ['details']))
81
-
82
- if getv(from_object, ['message']) is not None:
83
- setv(to_object, ['message'], getv(from_object, ['message']))
84
-
85
- if getv(from_object, ['code']) is not None:
86
- setv(to_object, ['code'], getv(from_object, ['code']))
87
-
88
- return to_object
89
-
90
-
91
- def _File_to_mldev(
62
+ def _DeleteFileParameters_to_mldev(
92
63
  from_object: Union[dict[str, Any], object],
93
64
  parent_object: Optional[dict[str, Any]] = None,
94
65
  ) -> dict[str, Any]:
95
66
  to_object: dict[str, Any] = {}
96
67
  if getv(from_object, ['name']) is not None:
97
- setv(to_object, ['name'], getv(from_object, ['name']))
98
-
99
- if getv(from_object, ['display_name']) is not None:
100
- setv(to_object, ['displayName'], getv(from_object, ['display_name']))
101
-
102
- if getv(from_object, ['mime_type']) is not None:
103
- setv(to_object, ['mimeType'], getv(from_object, ['mime_type']))
104
-
105
- if getv(from_object, ['size_bytes']) is not None:
106
- setv(to_object, ['sizeBytes'], getv(from_object, ['size_bytes']))
107
-
108
- if getv(from_object, ['create_time']) is not None:
109
- setv(to_object, ['createTime'], getv(from_object, ['create_time']))
110
-
111
- if getv(from_object, ['expiration_time']) is not None:
112
- setv(to_object, ['expirationTime'], getv(from_object, ['expiration_time']))
113
-
114
- if getv(from_object, ['update_time']) is not None:
115
- setv(to_object, ['updateTime'], getv(from_object, ['update_time']))
116
-
117
- if getv(from_object, ['sha256_hash']) is not None:
118
- setv(to_object, ['sha256Hash'], getv(from_object, ['sha256_hash']))
119
-
120
- if getv(from_object, ['uri']) is not None:
121
- setv(to_object, ['uri'], getv(from_object, ['uri']))
122
-
123
- if getv(from_object, ['download_uri']) is not None:
124
- setv(to_object, ['downloadUri'], getv(from_object, ['download_uri']))
125
-
126
- if getv(from_object, ['state']) is not None:
127
- setv(to_object, ['state'], getv(from_object, ['state']))
128
-
129
- if getv(from_object, ['source']) is not None:
130
- setv(to_object, ['source'], getv(from_object, ['source']))
131
-
132
- if getv(from_object, ['video_metadata']) is not None:
133
- setv(to_object, ['videoMetadata'], getv(from_object, ['video_metadata']))
134
-
135
- if getv(from_object, ['error']) is not None:
136
68
  setv(
137
- to_object,
138
- ['error'],
139
- _FileStatus_to_mldev(getv(from_object, ['error']), to_object),
69
+ to_object, ['_url', 'file'], t.t_file_name(getv(from_object, ['name']))
140
70
  )
141
71
 
142
72
  return to_object
143
73
 
144
74
 
145
- def _CreateFileParameters_to_mldev(
75
+ def _DeleteFileResponse_from_mldev(
146
76
  from_object: Union[dict[str, Any], object],
147
77
  parent_object: Optional[dict[str, Any]] = None,
148
78
  ) -> dict[str, Any]:
149
79
  to_object: dict[str, Any] = {}
150
- if getv(from_object, ['file']) is not None:
80
+ if getv(from_object, ['sdkHttpResponse']) is not None:
151
81
  setv(
152
- to_object,
153
- ['file'],
154
- _File_to_mldev(getv(from_object, ['file']), to_object),
82
+ to_object, ['sdk_http_response'], getv(from_object, ['sdkHttpResponse'])
155
83
  )
156
84
 
157
- if getv(from_object, ['config']) is not None:
158
- setv(to_object, ['config'], getv(from_object, ['config']))
159
-
160
85
  return to_object
161
86
 
162
87
 
@@ -170,95 +95,37 @@ def _GetFileParameters_to_mldev(
170
95
  to_object, ['_url', 'file'], t.t_file_name(getv(from_object, ['name']))
171
96
  )
172
97
 
173
- if getv(from_object, ['config']) is not None:
174
- setv(to_object, ['config'], getv(from_object, ['config']))
175
-
176
98
  return to_object
177
99
 
178
100
 
179
- def _DeleteFileParameters_to_mldev(
101
+ def _ListFilesConfig_to_mldev(
180
102
  from_object: Union[dict[str, Any], object],
181
103
  parent_object: Optional[dict[str, Any]] = None,
182
104
  ) -> dict[str, Any]:
183
105
  to_object: dict[str, Any] = {}
184
- if getv(from_object, ['name']) is not None:
106
+
107
+ if getv(from_object, ['page_size']) is not None:
185
108
  setv(
186
- to_object, ['_url', 'file'], t.t_file_name(getv(from_object, ['name']))
109
+ parent_object, ['_query', 'pageSize'], getv(from_object, ['page_size'])
187
110
  )
188
111
 
189
- if getv(from_object, ['config']) is not None:
190
- setv(to_object, ['config'], getv(from_object, ['config']))
191
-
192
- return to_object
193
-
194
-
195
- def _FileStatus_from_mldev(
196
- from_object: Union[dict[str, Any], object],
197
- parent_object: Optional[dict[str, Any]] = None,
198
- ) -> dict[str, Any]:
199
- to_object: dict[str, Any] = {}
200
- if getv(from_object, ['details']) is not None:
201
- setv(to_object, ['details'], getv(from_object, ['details']))
202
-
203
- if getv(from_object, ['message']) is not None:
204
- setv(to_object, ['message'], getv(from_object, ['message']))
205
-
206
- if getv(from_object, ['code']) is not None:
207
- setv(to_object, ['code'], getv(from_object, ['code']))
112
+ if getv(from_object, ['page_token']) is not None:
113
+ setv(
114
+ parent_object,
115
+ ['_query', 'pageToken'],
116
+ getv(from_object, ['page_token']),
117
+ )
208
118
 
209
119
  return to_object
210
120
 
211
121
 
212
- def _File_from_mldev(
122
+ def _ListFilesParameters_to_mldev(
213
123
  from_object: Union[dict[str, Any], object],
214
124
  parent_object: Optional[dict[str, Any]] = None,
215
125
  ) -> dict[str, Any]:
216
126
  to_object: dict[str, Any] = {}
217
- if getv(from_object, ['name']) is not None:
218
- setv(to_object, ['name'], getv(from_object, ['name']))
219
-
220
- if getv(from_object, ['displayName']) is not None:
221
- setv(to_object, ['display_name'], getv(from_object, ['displayName']))
222
-
223
- if getv(from_object, ['mimeType']) is not None:
224
- setv(to_object, ['mime_type'], getv(from_object, ['mimeType']))
225
-
226
- if getv(from_object, ['sizeBytes']) is not None:
227
- setv(to_object, ['size_bytes'], getv(from_object, ['sizeBytes']))
228
-
229
- if getv(from_object, ['createTime']) is not None:
230
- setv(to_object, ['create_time'], getv(from_object, ['createTime']))
231
-
232
- if getv(from_object, ['expirationTime']) is not None:
233
- setv(to_object, ['expiration_time'], getv(from_object, ['expirationTime']))
234
-
235
- if getv(from_object, ['updateTime']) is not None:
236
- setv(to_object, ['update_time'], getv(from_object, ['updateTime']))
237
-
238
- if getv(from_object, ['sha256Hash']) is not None:
239
- setv(to_object, ['sha256_hash'], getv(from_object, ['sha256Hash']))
240
-
241
- if getv(from_object, ['uri']) is not None:
242
- setv(to_object, ['uri'], getv(from_object, ['uri']))
243
-
244
- if getv(from_object, ['downloadUri']) is not None:
245
- setv(to_object, ['download_uri'], getv(from_object, ['downloadUri']))
246
-
247
- if getv(from_object, ['state']) is not None:
248
- setv(to_object, ['state'], getv(from_object, ['state']))
249
-
250
- if getv(from_object, ['source']) is not None:
251
- setv(to_object, ['source'], getv(from_object, ['source']))
252
-
253
- if getv(from_object, ['videoMetadata']) is not None:
254
- setv(to_object, ['video_metadata'], getv(from_object, ['videoMetadata']))
255
-
256
- if getv(from_object, ['error']) is not None:
257
- setv(
258
- to_object,
259
- ['error'],
260
- _FileStatus_from_mldev(getv(from_object, ['error']), to_object),
261
- )
127
+ if getv(from_object, ['config']) is not None:
128
+ _ListFilesConfig_to_mldev(getv(from_object, ['config']), to_object)
262
129
 
263
130
  return to_object
264
131
 
@@ -277,40 +144,7 @@ def _ListFilesResponse_from_mldev(
277
144
  setv(to_object, ['next_page_token'], getv(from_object, ['nextPageToken']))
278
145
 
279
146
  if getv(from_object, ['files']) is not None:
280
- setv(
281
- to_object,
282
- ['files'],
283
- [
284
- _File_from_mldev(item, to_object)
285
- for item in getv(from_object, ['files'])
286
- ],
287
- )
288
-
289
- return to_object
290
-
291
-
292
- def _CreateFileResponse_from_mldev(
293
- from_object: Union[dict[str, Any], object],
294
- parent_object: Optional[dict[str, Any]] = None,
295
- ) -> dict[str, Any]:
296
- to_object: dict[str, Any] = {}
297
- if getv(from_object, ['sdkHttpResponse']) is not None:
298
- setv(
299
- to_object, ['sdk_http_response'], getv(from_object, ['sdkHttpResponse'])
300
- )
301
-
302
- return to_object
303
-
304
-
305
- def _DeleteFileResponse_from_mldev(
306
- from_object: Union[dict[str, Any], object],
307
- parent_object: Optional[dict[str, Any]] = None,
308
- ) -> dict[str, Any]:
309
- to_object: dict[str, Any] = {}
310
- if getv(from_object, ['sdkHttpResponse']) is not None:
311
- setv(
312
- to_object, ['sdk_http_response'], getv(from_object, ['sdkHttpResponse'])
313
- )
147
+ setv(to_object, ['files'], [item for item in getv(from_object, ['files'])])
314
148
 
315
149
  return to_object
316
150
 
@@ -320,23 +154,6 @@ class Files(_api_module.BaseModule):
320
154
  def _list(
321
155
  self, *, config: Optional[types.ListFilesConfigOrDict] = None
322
156
  ) -> types.ListFilesResponse:
323
- """Lists all files from the service.
324
-
325
- Args:
326
- config (ListFilesConfig): Optional, configuration for the list method.
327
-
328
- Returns:
329
- ListFilesResponse: The response for the list method.
330
-
331
- Usage:
332
-
333
- .. code-block:: python
334
-
335
- pager = client.files.list(config={'page_size': 10})
336
- for file in pager.page:
337
- print(file.name)
338
- """
339
-
340
157
  parameter_model = types._ListFilesParameters(
341
158
  config=config,
342
159
  )
@@ -372,7 +189,7 @@ class Files(_api_module.BaseModule):
372
189
 
373
190
  response = self._api_client.request('get', path, request_dict, http_options)
374
191
 
375
- response_dict = '' if not response.body else json.loads(response.body)
192
+ response_dict = {} if not response.body else json.loads(response.body)
376
193
 
377
194
  if not self._api_client.vertexai:
378
195
  response_dict = _ListFilesResponse_from_mldev(response_dict)
@@ -437,7 +254,7 @@ class Files(_api_module.BaseModule):
437
254
  self._api_client._verify_response(return_value)
438
255
  return return_value
439
256
 
440
- response_dict = '' if not response.body else json.loads(response.body)
257
+ response_dict = {} if not response.body else json.loads(response.body)
441
258
 
442
259
  if not self._api_client.vertexai:
443
260
  response_dict = _CreateFileResponse_from_mldev(response_dict)
@@ -505,10 +322,7 @@ class Files(_api_module.BaseModule):
505
322
 
506
323
  response = self._api_client.request('get', path, request_dict, http_options)
507
324
 
508
- response_dict = '' if not response.body else json.loads(response.body)
509
-
510
- if not self._api_client.vertexai:
511
- response_dict = _File_from_mldev(response_dict)
325
+ response_dict = {} if not response.body else json.loads(response.body)
512
326
 
513
327
  return_value = types.File._from_response(
514
328
  response=response_dict, kwargs=parameter_model.model_dump()
@@ -574,7 +388,7 @@ class Files(_api_module.BaseModule):
574
388
  'delete', path, request_dict, http_options
575
389
  )
576
390
 
577
- response_dict = '' if not response.body else json.loads(response.body)
391
+ response_dict = {} if not response.body else json.loads(response.body)
578
392
 
579
393
  if not self._api_client.vertexai:
580
394
  response_dict = _DeleteFileResponse_from_mldev(response_dict)
@@ -588,6 +402,34 @@ class Files(_api_module.BaseModule):
588
402
  self._api_client._verify_response(return_value)
589
403
  return return_value
590
404
 
405
+ def list(
406
+ self, *, config: Optional[types.ListFilesConfigOrDict] = None
407
+ ) -> Pager[types.File]:
408
+ """Lists all files from the service.
409
+
410
+ Args:
411
+ config (ListFilesConfig): Optional, configuration for the list method.
412
+
413
+ Returns:
414
+ A Pager object that contains one page of files. When iterating over
415
+ the pager, it automatically fetches the next page if there are more.
416
+
417
+ Usage:
418
+
419
+ .. code-block:: python
420
+
421
+ for file in client.files.list(config={'page_size': 10}):
422
+ print(file.name)
423
+ """
424
+
425
+ list_request = self._list
426
+ return Pager(
427
+ 'files',
428
+ list_request,
429
+ self._list(config=config),
430
+ config,
431
+ )
432
+
591
433
  def upload(
592
434
  self,
593
435
  *,
@@ -624,54 +466,13 @@ class Files(_api_module.BaseModule):
624
466
  if file_obj.name is not None and not file_obj.name.startswith('files/'):
625
467
  file_obj.name = f'files/{file_obj.name}'
626
468
 
627
- if isinstance(file, io.IOBase):
628
- if file_obj.mime_type is None:
629
- raise ValueError(
630
- 'Unknown mime type: Could not determine the mimetype for your'
631
- ' file\n please set the `mime_type` argument'
632
- )
633
- if hasattr(file, 'mode'):
634
- if 'b' not in file.mode:
635
- raise ValueError('The file must be opened in binary mode.')
636
- offset = file.tell()
637
- file.seek(0, os.SEEK_END)
638
- file_obj.size_bytes = file.tell() - offset
639
- file.seek(offset, os.SEEK_SET)
640
- else:
641
- fs_path = os.fspath(file)
642
- if not fs_path or not os.path.isfile(fs_path):
643
- raise FileNotFoundError(f'{file} is not a valid file path.')
644
- file_obj.size_bytes = os.path.getsize(fs_path)
645
- if file_obj.mime_type is None:
646
- file_obj.mime_type, _ = mimetypes.guess_type(fs_path)
647
- if file_obj.mime_type is None:
648
- raise ValueError(
649
- 'Unknown mime type: Could not determine the mimetype for your'
650
- ' file\n please set the `mime_type` argument'
651
- )
652
-
653
- http_options: types.HttpOptions
654
- if config_model and config_model.http_options:
655
- http_options = config_model.http_options
656
- http_options.api_version = ''
657
- http_options.headers = {
658
- 'Content-Type': 'application/json',
659
- 'X-Goog-Upload-Protocol': 'resumable',
660
- 'X-Goog-Upload-Command': 'start',
661
- 'X-Goog-Upload-Header-Content-Length': f'{file_obj.size_bytes}',
662
- 'X-Goog-Upload-Header-Content-Type': f'{file_obj.mime_type}',
663
- }
664
- else:
665
- http_options = types.HttpOptions(
666
- api_version='',
667
- headers={
668
- 'Content-Type': 'application/json',
669
- 'X-Goog-Upload-Protocol': 'resumable',
670
- 'X-Goog-Upload-Command': 'start',
671
- 'X-Goog-Upload-Header-Content-Length': f'{file_obj.size_bytes}',
672
- 'X-Goog-Upload-Header-Content-Type': f'{file_obj.mime_type}',
673
- },
674
- )
469
+ http_options, size_bytes, mime_type = _extra_utils.prepare_resumable_upload(
470
+ file,
471
+ user_http_options=config_model.http_options,
472
+ user_mime_type=config_model.mime_type,
473
+ )
474
+ file_obj.size_bytes = size_bytes
475
+ file_obj.mime_type = mime_type
675
476
  response = self._create(
676
477
  file=file_obj,
677
478
  config=types.CreateFileConfig(
@@ -695,25 +496,16 @@ class Files(_api_module.BaseModule):
695
496
  file, upload_url, file_obj.size_bytes, http_options=http_options
696
497
  )
697
498
  else:
499
+ fs_path = os.fspath(file)
698
500
  return_file = self._api_client.upload_file(
699
501
  fs_path, upload_url, file_obj.size_bytes, http_options=http_options
700
502
  )
701
503
 
702
504
  return types.File._from_response(
703
- response=_File_from_mldev(return_file.json['file']),
505
+ response=return_file.json['file'],
704
506
  kwargs=config_model.model_dump() if config else {},
705
507
  )
706
508
 
707
- def list(
708
- self, *, config: Optional[types.ListFilesConfigOrDict] = None
709
- ) -> Pager[types.File]:
710
- return Pager(
711
- 'files',
712
- self._list,
713
- self._list(config=config),
714
- config,
715
- )
716
-
717
509
  def download(
718
510
  self,
719
511
  *,
@@ -801,23 +593,6 @@ class AsyncFiles(_api_module.BaseModule):
801
593
  async def _list(
802
594
  self, *, config: Optional[types.ListFilesConfigOrDict] = None
803
595
  ) -> types.ListFilesResponse:
804
- """Lists all files from the service.
805
-
806
- Args:
807
- config (ListFilesConfig): Optional, configuration for the list method.
808
-
809
- Returns:
810
- ListFilesResponse: The response for the list method.
811
-
812
- Usage:
813
-
814
- .. code-block:: python
815
-
816
- pager = await client.aio.files.list(config={'page_size': 10})
817
- for file in pager.page:
818
- print(file.name)
819
- """
820
-
821
596
  parameter_model = types._ListFilesParameters(
822
597
  config=config,
823
598
  )
@@ -855,7 +630,7 @@ class AsyncFiles(_api_module.BaseModule):
855
630
  'get', path, request_dict, http_options
856
631
  )
857
632
 
858
- response_dict = '' if not response.body else json.loads(response.body)
633
+ response_dict = {} if not response.body else json.loads(response.body)
859
634
 
860
635
  if not self._api_client.vertexai:
861
636
  response_dict = _ListFilesResponse_from_mldev(response_dict)
@@ -920,7 +695,7 @@ class AsyncFiles(_api_module.BaseModule):
920
695
  self._api_client._verify_response(return_value)
921
696
  return return_value
922
697
 
923
- response_dict = '' if not response.body else json.loads(response.body)
698
+ response_dict = {} if not response.body else json.loads(response.body)
924
699
 
925
700
  if not self._api_client.vertexai:
926
701
  response_dict = _CreateFileResponse_from_mldev(response_dict)
@@ -990,10 +765,7 @@ class AsyncFiles(_api_module.BaseModule):
990
765
  'get', path, request_dict, http_options
991
766
  )
992
767
 
993
- response_dict = '' if not response.body else json.loads(response.body)
994
-
995
- if not self._api_client.vertexai:
996
- response_dict = _File_from_mldev(response_dict)
768
+ response_dict = {} if not response.body else json.loads(response.body)
997
769
 
998
770
  return_value = types.File._from_response(
999
771
  response=response_dict, kwargs=parameter_model.model_dump()
@@ -1059,7 +831,7 @@ class AsyncFiles(_api_module.BaseModule):
1059
831
  'delete', path, request_dict, http_options
1060
832
  )
1061
833
 
1062
- response_dict = '' if not response.body else json.loads(response.body)
834
+ response_dict = {} if not response.body else json.loads(response.body)
1063
835
 
1064
836
  if not self._api_client.vertexai:
1065
837
  response_dict = _DeleteFileResponse_from_mldev(response_dict)
@@ -1073,6 +845,34 @@ class AsyncFiles(_api_module.BaseModule):
1073
845
  self._api_client._verify_response(return_value)
1074
846
  return return_value
1075
847
 
848
+ async def list(
849
+ self, *, config: Optional[types.ListFilesConfigOrDict] = None
850
+ ) -> AsyncPager[types.File]:
851
+ """Lists all files from the service asynchronously.
852
+
853
+ Args:
854
+ config (ListFilesConfig): Optional, configuration for the list method.
855
+
856
+ Returns:
857
+ A Pager object that contains one page of files. When iterating over
858
+ the pager, it automatically fetches the next page if there are more.
859
+
860
+ Usage:
861
+
862
+ .. code-block:: python
863
+
864
+ async for file in await client.aio.files.list(config={'page_size': 10}):
865
+ print(file.name)
866
+ """
867
+
868
+ list_request = self._list
869
+ return AsyncPager(
870
+ 'files',
871
+ list_request,
872
+ await self._list(config=config),
873
+ config,
874
+ )
875
+
1076
876
  async def upload(
1077
877
  self,
1078
878
  *,
@@ -1109,54 +909,13 @@ class AsyncFiles(_api_module.BaseModule):
1109
909
  if file_obj.name is not None and not file_obj.name.startswith('files/'):
1110
910
  file_obj.name = f'files/{file_obj.name}'
1111
911
 
1112
- if isinstance(file, io.IOBase):
1113
- if file_obj.mime_type is None:
1114
- raise ValueError(
1115
- 'Unknown mime type: Could not determine the mimetype for your'
1116
- ' file\n please set the `mime_type` argument'
1117
- )
1118
- if hasattr(file, 'mode'):
1119
- if 'b' not in file.mode:
1120
- raise ValueError('The file must be opened in binary mode.')
1121
- offset = file.tell()
1122
- file.seek(0, os.SEEK_END)
1123
- file_obj.size_bytes = file.tell() - offset
1124
- file.seek(offset, os.SEEK_SET)
1125
- else:
1126
- fs_path = os.fspath(file)
1127
- if not fs_path or not os.path.isfile(fs_path):
1128
- raise FileNotFoundError(f'{file} is not a valid file path.')
1129
- file_obj.size_bytes = os.path.getsize(fs_path)
1130
- if file_obj.mime_type is None:
1131
- file_obj.mime_type, _ = mimetypes.guess_type(fs_path)
1132
- if file_obj.mime_type is None:
1133
- raise ValueError(
1134
- 'Unknown mime type: Could not determine the mimetype for your'
1135
- ' file\n please set the `mime_type` argument'
1136
- )
1137
-
1138
- http_options: types.HttpOptions
1139
- if config_model and config_model.http_options:
1140
- http_options = config_model.http_options
1141
- http_options.api_version = ''
1142
- http_options.headers = {
1143
- 'Content-Type': 'application/json',
1144
- 'X-Goog-Upload-Protocol': 'resumable',
1145
- 'X-Goog-Upload-Command': 'start',
1146
- 'X-Goog-Upload-Header-Content-Length': f'{file_obj.size_bytes}',
1147
- 'X-Goog-Upload-Header-Content-Type': f'{file_obj.mime_type}',
1148
- }
1149
- else:
1150
- http_options = types.HttpOptions(
1151
- api_version='',
1152
- headers={
1153
- 'Content-Type': 'application/json',
1154
- 'X-Goog-Upload-Protocol': 'resumable',
1155
- 'X-Goog-Upload-Command': 'start',
1156
- 'X-Goog-Upload-Header-Content-Length': f'{file_obj.size_bytes}',
1157
- 'X-Goog-Upload-Header-Content-Type': f'{file_obj.mime_type}',
1158
- },
1159
- )
912
+ http_options, size_bytes, mime_type = _extra_utils.prepare_resumable_upload(
913
+ file,
914
+ user_http_options=config_model.http_options,
915
+ user_mime_type=config_model.mime_type,
916
+ )
917
+ file_obj.size_bytes = size_bytes
918
+ file_obj.mime_type = mime_type
1160
919
  response = await self._create(
1161
920
  file=file_obj,
1162
921
  config=types.CreateFileConfig(
@@ -1185,25 +944,16 @@ class AsyncFiles(_api_module.BaseModule):
1185
944
  file, upload_url, file_obj.size_bytes, http_options=http_options
1186
945
  )
1187
946
  else:
947
+ fs_path = os.fspath(file)
1188
948
  return_file = await self._api_client.async_upload_file(
1189
949
  fs_path, upload_url, file_obj.size_bytes, http_options=http_options
1190
950
  )
1191
951
 
1192
952
  return types.File._from_response(
1193
- response=_File_from_mldev(return_file.json['file']),
953
+ response=return_file.json['file'],
1194
954
  kwargs=config_model.model_dump() if config else {},
1195
955
  )
1196
956
 
1197
- async def list(
1198
- self, *, config: Optional[types.ListFilesConfigOrDict] = None
1199
- ) -> AsyncPager[types.File]:
1200
- return AsyncPager(
1201
- 'files',
1202
- self._list,
1203
- await self._list(config=config),
1204
- config,
1205
- )
1206
-
1207
957
  async def download(
1208
958
  self,
1209
959
  *,