pybiolib 1.1.1718__tar.gz → 1.1.1730__tar.gz

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 (105) hide show
  1. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/PKG-INFO +1 -1
  2. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/_internal/http_client.py +9 -6
  3. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/api/client.py +4 -1
  4. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/compute_node/job_worker/job_storage.py +7 -9
  5. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/lfs/utils.py +9 -17
  6. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/utils/__init__.py +12 -39
  7. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/utils/multipart_uploader.py +27 -60
  8. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/pyproject.toml +1 -1
  9. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/LICENSE +0 -0
  10. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/README.md +0 -0
  11. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/__init__.py +0 -0
  12. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/_internal/__init__.py +0 -0
  13. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/_internal/push_application.py +0 -0
  14. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/api/__init__.py +0 -0
  15. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/app/__init__.py +0 -0
  16. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/app/app.py +0 -0
  17. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/app/search_apps.py +0 -0
  18. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/biolib_api_client/__init__.py +0 -0
  19. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/biolib_api_client/api_client.py +0 -0
  20. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/biolib_api_client/app_types.py +0 -0
  21. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/biolib_api_client/auth.py +0 -0
  22. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/biolib_api_client/biolib_account_api.py +0 -0
  23. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/biolib_api_client/biolib_app_api.py +0 -0
  24. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/biolib_api_client/biolib_job_api.py +0 -0
  25. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/biolib_api_client/biolib_large_file_system_api.py +0 -0
  26. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/biolib_api_client/common_types.py +0 -0
  27. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/biolib_api_client/job_types.py +0 -0
  28. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/biolib_api_client/lfs_types.py +0 -0
  29. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/biolib_api_client/user_state.py +0 -0
  30. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/biolib_binary_format/__init__.py +0 -0
  31. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/biolib_binary_format/base_bbf_package.py +0 -0
  32. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/biolib_binary_format/file_in_container.py +0 -0
  33. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/biolib_binary_format/module_input.py +0 -0
  34. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/biolib_binary_format/module_output_v2.py +0 -0
  35. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/biolib_binary_format/remote_endpoints.py +0 -0
  36. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/biolib_binary_format/remote_stream_seeker.py +0 -0
  37. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/biolib_binary_format/saved_job.py +0 -0
  38. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/biolib_binary_format/stdout_and_stderr.py +0 -0
  39. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/biolib_binary_format/system_exception.py +0 -0
  40. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/biolib_binary_format/system_status_update.py +0 -0
  41. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/biolib_binary_format/utils.py +0 -0
  42. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/biolib_docker_client/__init__.py +0 -0
  43. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/biolib_download_container.py +0 -0
  44. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/biolib_errors.py +0 -0
  45. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/biolib_logging.py +0 -0
  46. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/cli/__init__.py +0 -0
  47. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/cli/download_container.py +0 -0
  48. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/cli/init.py +0 -0
  49. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/cli/lfs.py +0 -0
  50. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/cli/push.py +0 -0
  51. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/cli/run.py +0 -0
  52. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/cli/runtime.py +0 -0
  53. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/cli/start.py +0 -0
  54. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/compute_node/.gitignore +0 -0
  55. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/compute_node/__init__.py +0 -0
  56. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/compute_node/cloud_utils/__init__.py +0 -0
  57. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/compute_node/cloud_utils/cloud_utils.py +0 -0
  58. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/compute_node/job_worker/__init__.py +0 -0
  59. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/compute_node/job_worker/cache_state.py +0 -0
  60. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/compute_node/job_worker/cache_types.py +0 -0
  61. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/compute_node/job_worker/docker_image_cache.py +0 -0
  62. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/compute_node/job_worker/executors/__init__.py +0 -0
  63. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/compute_node/job_worker/executors/docker_executor.py +0 -0
  64. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/compute_node/job_worker/executors/docker_types.py +0 -0
  65. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/compute_node/job_worker/executors/tars/__init__.py +0 -0
  66. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/compute_node/job_worker/executors/types.py +0 -0
  67. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/compute_node/job_worker/job_legacy_input_wait_timeout_thread.py +0 -0
  68. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/compute_node/job_worker/job_max_runtime_timer_thread.py +0 -0
  69. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/compute_node/job_worker/job_worker.py +0 -0
  70. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/compute_node/job_worker/large_file_system.py +0 -0
  71. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/compute_node/job_worker/mappings.py +0 -0
  72. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/compute_node/job_worker/utilization_reporter_thread.py +0 -0
  73. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/compute_node/job_worker/utils.py +0 -0
  74. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/compute_node/remote_host_proxy.py +0 -0
  75. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/compute_node/socker_listener_thread.py +0 -0
  76. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/compute_node/socket_sender_thread.py +0 -0
  77. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/compute_node/utils.py +0 -0
  78. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/compute_node/webserver/__init__.py +0 -0
  79. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/compute_node/webserver/gunicorn_flask_application.py +0 -0
  80. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/compute_node/webserver/webserver.py +0 -0
  81. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/compute_node/webserver/webserver_types.py +0 -0
  82. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/compute_node/webserver/webserver_utils.py +0 -0
  83. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/compute_node/webserver/worker_thread.py +0 -0
  84. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/experiments/__init__.py +0 -0
  85. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/experiments/experiment.py +0 -0
  86. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/experiments/types.py +0 -0
  87. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/jobs/__init__.py +0 -0
  88. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/jobs/job.py +0 -0
  89. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/jobs/job_result.py +0 -0
  90. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/jobs/types.py +0 -0
  91. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/lfs/__init__.py +0 -0
  92. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/lfs/cache.py +0 -0
  93. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/runtime/__init__.py +0 -0
  94. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/runtime/results.py +0 -0
  95. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/sdk/__init__.py +0 -0
  96. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/tables.py +0 -0
  97. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/templates/__init__.py +0 -0
  98. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/templates/example_app.py +0 -0
  99. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/typing_utils.py +0 -0
  100. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/user/__init__.py +0 -0
  101. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/user/sign_in.py +0 -0
  102. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/utils/app_uri.py +0 -0
  103. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/utils/cache_state.py +0 -0
  104. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/utils/seq_util.py +0 -0
  105. {pybiolib-1.1.1718 → pybiolib-1.1.1730}/biolib/utils/zip/remote_zip.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pybiolib
3
- Version: 1.1.1718
3
+ Version: 1.1.1730
4
4
  Summary: BioLib Python Client
5
5
  Home-page: https://github.com/biolib
6
6
  License: MIT
@@ -43,9 +43,10 @@ class HttpError(urllib.error.HTTPError):
43
43
 
44
44
  class HttpResponse:
45
45
  def __init__(self, response):
46
- self.status_code = response.status
47
- self.content = response.read()
48
- self.url = response.geturl()
46
+ self.headers: Dict[str, str] = dict(response.headers)
47
+ self.status_code: int = int(response.status)
48
+ self.content: bytes = response.read()
49
+ self.url: str = response.geturl()
49
50
 
50
51
  @property
51
52
  def text(self) -> str:
@@ -61,10 +62,11 @@ class HttpClient:
61
62
  @staticmethod
62
63
  def request(
63
64
  url: str,
64
- method: Optional[Literal['GET', 'POST', 'PATCH']] = None,
65
+ method: Optional[Literal['GET', 'POST', 'PATCH', 'PUT']] = None,
65
66
  data: Optional[Union[Dict, bytes]] = None,
66
67
  headers: Optional[Dict[str, str]] = None,
67
68
  retries: int = 5,
69
+ timeout_in_seconds: Optional[int] = None,
68
70
  ) -> HttpResponse:
69
71
  if not HttpClient.ssl_context:
70
72
  HttpClient.ssl_context = _create_ssl_context()
@@ -79,7 +81,8 @@ class HttpClient:
79
81
  headers=headers_to_send,
80
82
  method=method or 'GET',
81
83
  )
82
- timeout_in_seconds = 60 if isinstance(data, dict) else 180 # TODO: Calculate timeout based on data size
84
+ if timeout_in_seconds is None:
85
+ timeout_in_seconds = 60 if isinstance(data, dict) else 180 # TODO: Calculate timeout based on data size
83
86
 
84
87
  last_error: Optional[urllib.error.URLError] = None
85
88
  for retry_count in range(retries + 1):
@@ -90,7 +93,7 @@ class HttpClient:
90
93
  with urllib.request.urlopen(
91
94
  request,
92
95
  context=HttpClient.ssl_context,
93
- timeout=timeout_in_seconds
96
+ timeout=timeout_in_seconds,
94
97
  ) as response:
95
98
  return HttpResponse(response)
96
99
 
@@ -4,7 +4,10 @@ from biolib.typing_utils import Dict, Optional, Union
4
4
  from biolib.biolib_api_client import BiolibApiClient as DeprecatedApiClient
5
5
  from biolib._internal.http_client import HttpResponse, HttpClient
6
6
 
7
- OptionalHeaders = Optional[Dict[str, Union[str, None]]]
7
+ OptionalHeaders = Union[
8
+ Optional[Dict[str, str]],
9
+ Optional[Dict[str, Union[str, None]]],
10
+ ]
8
11
 
9
12
 
10
13
  class ApiClient(HttpClient):
@@ -2,7 +2,7 @@ import os
2
2
 
3
3
  from biolib import utils
4
4
  from biolib._internal.http_client import HttpClient
5
- from biolib.biolib_api_client import BiolibApiClient, CreatedJobDict
5
+ from biolib.biolib_api_client import CreatedJobDict
6
6
  from biolib.biolib_api_client.biolib_job_api import BiolibJobApi
7
7
  from biolib.compute_node.cloud_utils import CloudUtils
8
8
  from biolib.biolib_logging import logger_no_user_data
@@ -14,24 +14,23 @@ class JobStorage:
14
14
 
15
15
  @staticmethod
16
16
  def upload_module_input(job: CreatedJobDict, module_input_serialized: bytes) -> None:
17
- base_url = BiolibApiClient.get().base_url
18
17
  job_uuid = job['public_id']
19
18
  headers = {'Job-Auth-Token': job['auth_token']}
20
19
 
21
20
  multipart_uploader = utils.MultiPartUploader(
22
21
  start_multipart_upload_request=dict(
23
22
  requires_biolib_auth=False,
24
- url=f'{base_url}/api/jobs/{job_uuid}/storage/input/start_upload/',
23
+ path=f'/jobs/{job_uuid}/storage/input/start_upload/',
25
24
  headers=headers
26
25
  ),
27
26
  get_presigned_upload_url_request=dict(
28
27
  requires_biolib_auth=False,
29
- url=f'{base_url}/api/jobs/{job_uuid}/storage/input/presigned_upload_url/',
28
+ path=f'/jobs/{job_uuid}/storage/input/presigned_upload_url/',
30
29
  headers=headers
31
30
  ),
32
31
  complete_upload_request=dict(
33
32
  requires_biolib_auth=False,
34
- url=f'{base_url}/api/jobs/{job_uuid}/storage/input/complete_upload/',
33
+ path=f'/jobs/{job_uuid}/storage/input/complete_upload/',
35
34
  headers=headers
36
35
  ),
37
36
  )
@@ -59,7 +58,6 @@ class JobStorage:
59
58
 
60
59
  @staticmethod
61
60
  def _get_module_output_uploader(job_uuid: str) -> utils.MultiPartUploader:
62
- base_url = BiolibApiClient.get().base_url
63
61
  config = CloudUtils.get_webserver_config()
64
62
  compute_node_auth_token = config['compute_node_info']['auth_token'] # pylint: disable=unsubscriptable-object
65
63
  headers = {'Compute-Node-Auth-Token': compute_node_auth_token}
@@ -67,17 +65,17 @@ class JobStorage:
67
65
  return utils.MultiPartUploader(
68
66
  start_multipart_upload_request=dict(
69
67
  requires_biolib_auth=False,
70
- url=f'{base_url}/api/jobs/{job_uuid}/storage/results/start_upload/',
68
+ path=f'/jobs/{job_uuid}/storage/results/start_upload/',
71
69
  headers=headers,
72
70
  ),
73
71
  get_presigned_upload_url_request=dict(
74
72
  requires_biolib_auth=False,
75
- url=f'{base_url}/api/jobs/{job_uuid}/storage/results/presigned_upload_url/',
73
+ path=f'/jobs/{job_uuid}/storage/results/presigned_upload_url/',
76
74
  headers=headers,
77
75
  ),
78
76
  complete_upload_request=dict(
79
77
  requires_biolib_auth=False,
80
- url=f'{base_url}/api/jobs/{job_uuid}/storage/results/complete_upload/',
78
+ path=f'/jobs/{job_uuid}/storage/results/complete_upload/',
81
79
  headers=headers,
82
80
  ),
83
81
  )
@@ -6,9 +6,8 @@ from collections import namedtuple
6
6
  from pathlib import Path
7
7
  from struct import Struct
8
8
 
9
- import requests
10
-
11
9
  from biolib import utils
10
+ from biolib._internal.http_client import HttpClient
12
11
  from biolib.app import BioLibApp
13
12
  from biolib.biolib_api_client.biolib_account_api import BiolibAccountApi
14
13
  from biolib.biolib_api_client.biolib_large_file_system_api import BiolibLargeFileSystemApi
@@ -143,18 +142,17 @@ def push_large_file_system(lfs_uri: str, input_dir: str, chunk_size_in_mb: Optio
143
142
 
144
143
  iterable_zip_stream = get_iterable_zip_stream(files=files_to_zip, chunk_size=chunk_size_in_bytes)
145
144
 
146
- base_url = BiolibApiClient.get().base_url
147
145
  multipart_uploader = utils.MultiPartUploader(
148
146
  use_process_pool=True,
149
147
  get_presigned_upload_url_request=dict(
150
148
  headers=None,
151
149
  requires_biolib_auth=True,
152
- url=f'{base_url}/api/lfs/versions/{lfs_resource_version_uuid}/presigned_upload_url/',
150
+ path=f'/lfs/versions/{lfs_resource_version_uuid}/presigned_upload_url/',
153
151
  ),
154
152
  complete_upload_request=dict(
155
153
  headers=None,
156
154
  requires_biolib_auth=True,
157
- url=f'{base_url}/api/lfs/versions/{lfs_resource_version_uuid}/complete_upload/',
155
+ path=f'/lfs/versions/{lfs_resource_version_uuid}/complete_upload/',
158
156
  ),
159
157
  )
160
158
 
@@ -221,25 +219,19 @@ def get_file_data_from_large_file_system(lfs_uri: str, file_path: str) -> bytes:
221
219
  local_file_header_start = file_info['header_offset'] + len(local_file_header_signature_bytes)
222
220
  local_file_header_end = local_file_header_start + local_file_header_struct.size
223
221
 
224
- local_file_header_response = requests.get(
222
+ local_file_header_response = HttpClient.request(
225
223
  url=lfs_url,
226
- stream=True,
227
224
  headers={'range': f'bytes={local_file_header_start}-{local_file_header_end - 1}'},
228
- timeout=300,
225
+ timeout_in_seconds=300,
229
226
  )
230
- local_file_header_response.raise_for_status()
231
- local_file_header_bytes: bytes = local_file_header_response.raw.data
232
- local_file_header = LocalFileHeader._make(local_file_header_struct.unpack(local_file_header_bytes))
227
+ local_file_header = LocalFileHeader._make(local_file_header_struct.unpack(local_file_header_response.content))
233
228
 
234
229
  file_start = local_file_header_end + local_file_header.file_name_len + local_file_header.extra_field_len
235
230
  file_end = file_start + file_info['file_size']
236
231
 
237
- response = requests.get(
232
+ response = HttpClient.request(
238
233
  url=lfs_url,
239
- stream=True,
240
234
  headers={'range': f'bytes={file_start}-{file_end - 1}'},
241
- timeout=300, # timeout after 5 min
235
+ timeout_in_seconds=300, # timeout after 5 min
242
236
  )
243
- response.raise_for_status()
244
- data: bytes = response.raw.data
245
- return data
237
+ return response.content
@@ -1,22 +1,19 @@
1
1
  import collections.abc
2
2
  import multiprocessing
3
3
  import os
4
- import time
5
4
  import socket
6
5
  import sys
7
6
 
8
7
  from typing import Optional
9
- import requests
10
8
  from importlib_metadata import version, PackageNotFoundError
11
9
 
12
10
  from biolib.utils.seq_util import SeqUtil, SeqUtilRecord
13
-
14
- # try fetching version, if it fails (usually when in dev), add default
15
- from biolib.biolib_errors import BioLibError
11
+ from biolib._internal.http_client import HttpClient
16
12
  from biolib.biolib_logging import logger_no_user_data, logger
17
13
  from biolib.typing_utils import Tuple, Iterator
18
14
  from .multipart_uploader import MultiPartUploader, get_chunk_iterator_from_bytes
19
15
 
16
+ # try fetching version, if it fails (usually when in dev), add default
20
17
  try:
21
18
  BIOLIB_PACKAGE_VERSION = version('pybiolib')
22
19
  except PackageNotFoundError:
@@ -87,38 +84,17 @@ DownloadChunkInputTuple = Tuple[ByteRangeTuple, str]
87
84
 
88
85
 
89
86
  def _download_chunk(input_tuple: DownloadChunkInputTuple) -> bytes:
90
- max_download_retries = 10
91
-
92
87
  byte_range, presigned_url = input_tuple
93
88
  start, end = byte_range
94
89
 
95
- for retry_attempt in range(max_download_retries):
96
- if retry_attempt > 0:
97
- logger_no_user_data.debug(f'Attempt number {retry_attempt} for part {start}')
98
- try:
99
- response = requests.get(
100
- url=presigned_url,
101
- stream=True,
102
- headers={'range': f'bytes={start}-{end}'},
103
- timeout=300, # timeout after 5 min
104
- )
105
- if response.ok:
106
- return_value: bytes = response.raw.data
107
- logger_no_user_data.debug(f'Returning raw data for part {start}')
108
- return return_value
109
- else:
110
- logger_no_user_data.warning(
111
- f'Got not ok response when downloading part {start}:{end}. '
112
- f'Got response status {response.status_code} and content: {response.content.decode()} '
113
- f'Retrying...'
114
- )
115
- except Exception: # pylint: disable=broad-except
116
- logger_no_user_data.warning(f'Encountered error when downloading part {start}:{end}. Retrying...')
117
-
118
- time.sleep(5)
119
-
120
- logger_no_user_data.debug(f'Max retries hit, when downloading part {start}:{end}. Exiting...')
121
- raise BioLibError(f'Max retries hit, when downloading part {start}:{end}. Exiting...')
90
+ response = HttpClient.request(
91
+ url=presigned_url,
92
+ headers={'range': f'bytes={start}-{end}'},
93
+ timeout_in_seconds=300, # timeout after 5 min
94
+ retries=10,
95
+ )
96
+ logger_no_user_data.debug(f'Returning raw data for part {start}')
97
+ return response.content
122
98
 
123
99
 
124
100
  class ChunkIterator(collections.abc.Iterator):
@@ -153,11 +129,8 @@ class ChunkIterator(collections.abc.Iterator):
153
129
  def download_presigned_s3_url(presigned_url: str, output_file_path: str) -> None:
154
130
  chunk_size = 50_000_000
155
131
 
156
- with requests.get(presigned_url, stream=True, headers={'range': 'bytes=0-1'}) as response:
157
- if not response.ok:
158
- raise Exception(f'Got response status code {response.status_code} and content {response.content.decode()}')
159
-
160
- file_size = int(response.headers['Content-Range'].split('/')[1])
132
+ response = HttpClient.request(url=presigned_url, headers={'range': 'bytes=0-1'})
133
+ file_size = int(response.headers['Content-Range'].split('/')[1])
161
134
 
162
135
  chunk_iterator = ChunkIterator(file_size, chunk_size, presigned_url)
163
136
 
@@ -5,10 +5,9 @@ import os
5
5
  import time
6
6
  from urllib.parse import urlparse
7
7
 
8
- import requests
9
-
8
+ import biolib.api
9
+ from biolib._internal.http_client import HttpClient
10
10
  from biolib.biolib_api_client import BiolibApiClient
11
- from biolib.biolib_api_client.auth import BearerAuth
12
11
  from biolib.biolib_errors import BioLibError
13
12
  from biolib.biolib_logging import logger, logger_no_user_data
14
13
  from biolib.typing_utils import TypedDict, List, Iterator, Tuple, Optional, Dict
@@ -33,7 +32,7 @@ def get_chunk_iterator_from_file_object(file_object, chunk_size_in_bytes: int =
33
32
  class RequestOptions(TypedDict):
34
33
  headers: Optional[Dict[str, str]]
35
34
  requires_biolib_auth: bool
36
- url: str
35
+ path: str
37
36
 
38
37
 
39
38
  class _PartMetadata(TypedDict):
@@ -67,20 +66,15 @@ class MultiPartUploader:
67
66
  logger_no_user_data.debug(f'Starting multipart upload of payload with size {payload_size_in_bytes} bytes')
68
67
 
69
68
  if self._start_multipart_upload_request:
70
- requires_biolib_auth = self._start_multipart_upload_request['requires_biolib_auth']
71
- start_multipart_upload = requests.post(
72
- auth=BearerAuth(BiolibApiClient.get().access_token) if requires_biolib_auth else None,
73
- headers=self._start_multipart_upload_request['headers'],
74
- timeout=30,
75
- url=self._start_multipart_upload_request['url'],
76
- )
77
- if start_multipart_upload.ok:
78
- logger_no_user_data.debug('Multipart upload started')
79
- else:
80
- logger_no_user_data.debug(
81
- f'Failed to start multipart upload got response status: {start_multipart_upload.status_code}'
69
+ try:
70
+ biolib.api.client.post(
71
+ authenticate=self._start_multipart_upload_request['requires_biolib_auth'],
72
+ headers=self._start_multipart_upload_request['headers'],
73
+ path=self._start_multipart_upload_request['path'],
82
74
  )
83
- raise Exception('Failed to start multipart upload')
75
+ except BaseException as error:
76
+ logger_no_user_data.debug(f'Failed to start multipart upload got error: {error}')
77
+ raise error
84
78
 
85
79
  # if multiprocessing start method is spawn or we are running in a daemon process,
86
80
  # multiprocessing.Pool may fail when called from script
@@ -116,30 +110,12 @@ class MultiPartUploader:
116
110
  BiolibApiClient.refresh_auth_token()
117
111
 
118
112
  logger_no_user_data.debug(f'Uploaded {len(parts)} parts, now calling complete upload...')
119
- for index in range(3):
120
- try:
121
- complete_upload_response = requests.post(
122
- auth=BearerAuth(BiolibApiClient.get().access_token) if requires_biolib_auth else None,
123
- headers=self._complete_upload_request['headers'],
124
- json={'parts': parts, 'size_bytes': self._bytes_uploaded},
125
- timeout=30,
126
- url=self._complete_upload_request['url'],
127
- )
128
- if complete_upload_response.ok:
129
- logger_no_user_data.debug('Multipart upload completed returning')
130
- return
131
-
132
- logger_no_user_data.warning(
133
- f'Failed to complete multipart upload got response status {complete_upload_response.status_code}. '
134
- f'Retrying...'
135
- )
136
-
137
- except Exception as error: # pylint: disable=broad-except
138
- logger_no_user_data.warning('Encountered error when completing multipart upload. Retrying...')
139
- logger.debug(f'Multipart complete error: {error}')
140
- time.sleep(index * index + 2)
141
-
142
- raise BioLibError('Max retries hit, when completing multipart upload')
113
+ biolib.api.client.post(
114
+ authenticate=requires_biolib_auth,
115
+ headers=self._complete_upload_request['headers'],
116
+ data={'parts': parts, 'size_bytes': self._bytes_uploaded},
117
+ path=self._complete_upload_request['path'],
118
+ )
143
119
 
144
120
  def _upload_chunk(self, _input: _UploadChunkInputType) -> _UploadChunkReturnType:
145
121
  part_number, chunk = _input
@@ -152,18 +128,12 @@ class MultiPartUploader:
152
128
  logger_no_user_data.debug(f'Uploading part number {part_number} with size {len(chunk)} bytes...')
153
129
  try:
154
130
  logger_no_user_data.debug(f'Getting upload URL for chunk {part_number}...')
155
- get_url_response = requests.get(
156
- auth=BearerAuth(BiolibApiClient.get().access_token) if requires_biolib_auth else None,
131
+ get_url_response = biolib.api.client.get(
132
+ authenticate=requires_biolib_auth,
157
133
  headers=self._get_presigned_upload_url_request['headers'],
158
134
  params={'part_number': part_number},
159
- timeout=30,
160
- url=self._get_presigned_upload_url_request['url'],
135
+ path=self._get_presigned_upload_url_request['path'],
161
136
  )
162
- if not get_url_response.ok:
163
- raise Exception(
164
- f'Failed to get upload URL for part {part_number} got response status code '
165
- f'{get_url_response.status_code}'
166
- )
167
137
 
168
138
  presigned_upload_url = get_url_response.json()['presigned_upload_url']
169
139
 
@@ -174,16 +144,13 @@ class MultiPartUploader:
174
144
  presigned_upload_url = \
175
145
  f'{app_caller_proxy_job_storage_base_url}{parsed_url.path}?{parsed_url.query}'
176
146
 
177
- put_chunk_response = requests.put(url=presigned_upload_url, data=chunk, timeout=300)
178
-
179
- if put_chunk_response.ok:
180
- return _PartMetadata(PartNumber=part_number, ETag=put_chunk_response.headers['ETag']), len(chunk)
181
- else:
182
- logger_no_user_data.warning(
183
- f'Got response with status {put_chunk_response.status_code} when uploading part {part_number}. '
184
- 'Retrying...'
185
- )
186
- logger.debug(f'Response content: {put_chunk_response.content.decode()}')
147
+ put_chunk_response = HttpClient.request(
148
+ url=presigned_upload_url,
149
+ data=chunk,
150
+ method='PUT',
151
+ timeout_in_seconds=300,
152
+ )
153
+ return _PartMetadata(PartNumber=part_number, ETag=put_chunk_response.headers['ETag']), len(chunk)
187
154
 
188
155
  except Exception as error: # pylint: disable=broad-except
189
156
  logger_no_user_data.warning(f'Encountered error when uploading part {part_number}. Retrying...')
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "pybiolib"
3
- version = "1.1.1718"
3
+ version = "1.1.1730"
4
4
  description = "BioLib Python Client"
5
5
  readme = "README.md"
6
6
  license = "MIT"
File without changes
File without changes