pybiolib 1.2.166__tar.gz → 1.2.174__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 (124) hide show
  1. {pybiolib-1.2.166 → pybiolib-1.2.174}/PKG-INFO +1 -1
  2. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/_data_record/data_record.py +66 -32
  3. pybiolib-1.2.174/biolib/_internal/types/file_node.py +17 -0
  4. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/compute_node/remote_host_proxy.py +9 -0
  5. {pybiolib-1.2.166 → pybiolib-1.2.174}/pyproject.toml +1 -1
  6. {pybiolib-1.2.166 → pybiolib-1.2.174}/LICENSE +0 -0
  7. {pybiolib-1.2.166 → pybiolib-1.2.174}/PYPI_README.md +0 -0
  8. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/__init__.py +0 -0
  9. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/_internal/__init__.py +0 -0
  10. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/_internal/data_record/__init__.py +0 -0
  11. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/_internal/data_record/data_record.py +0 -0
  12. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/_internal/data_record/push_data.py +0 -0
  13. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/_internal/data_record/remote_storage_endpoint.py +0 -0
  14. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/_internal/file_utils.py +0 -0
  15. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/_internal/fuse_mount/__init__.py +0 -0
  16. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/_internal/fuse_mount/experiment_fuse_mount.py +0 -0
  17. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/_internal/http_client.py +0 -0
  18. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/_internal/lfs/__init__.py +0 -0
  19. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/_internal/lfs/cache.py +0 -0
  20. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/_internal/libs/__init__.py +0 -0
  21. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/_internal/libs/fusepy/__init__.py +0 -0
  22. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/_internal/push_application.py +0 -0
  23. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/_internal/runtime.py +0 -0
  24. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/_internal/types/__init__.py +0 -0
  25. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/_internal/types/app.py +0 -0
  26. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/_internal/types/data_record.py +0 -0
  27. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/_internal/types/experiment.py +0 -0
  28. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/_internal/types/resource.py +0 -0
  29. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/_internal/types/resource_version.py +0 -0
  30. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/_internal/types/typing.py +0 -0
  31. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/_internal/utils/__init__.py +0 -0
  32. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/_internal/utils/multinode.py +0 -0
  33. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/_runtime/runtime.py +0 -0
  34. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/api/__init__.py +0 -0
  35. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/api/client.py +0 -0
  36. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/app/__init__.py +0 -0
  37. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/app/app.py +0 -0
  38. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/app/search_apps.py +0 -0
  39. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/biolib_api_client/__init__.py +0 -0
  40. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/biolib_api_client/api_client.py +0 -0
  41. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/biolib_api_client/app_types.py +0 -0
  42. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/biolib_api_client/auth.py +0 -0
  43. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/biolib_api_client/biolib_app_api.py +0 -0
  44. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/biolib_api_client/biolib_job_api.py +0 -0
  45. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/biolib_api_client/common_types.py +0 -0
  46. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/biolib_api_client/job_types.py +0 -0
  47. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/biolib_api_client/lfs_types.py +0 -0
  48. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/biolib_api_client/user_state.py +0 -0
  49. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/biolib_binary_format/__init__.py +0 -0
  50. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/biolib_binary_format/base_bbf_package.py +0 -0
  51. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/biolib_binary_format/file_in_container.py +0 -0
  52. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/biolib_binary_format/module_input.py +0 -0
  53. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/biolib_binary_format/module_output_v2.py +0 -0
  54. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/biolib_binary_format/remote_endpoints.py +0 -0
  55. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/biolib_binary_format/remote_stream_seeker.py +0 -0
  56. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/biolib_binary_format/saved_job.py +0 -0
  57. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/biolib_binary_format/stdout_and_stderr.py +0 -0
  58. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/biolib_binary_format/system_exception.py +0 -0
  59. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/biolib_binary_format/system_status_update.py +0 -0
  60. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/biolib_binary_format/utils.py +0 -0
  61. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/biolib_docker_client/__init__.py +0 -0
  62. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/biolib_download_container.py +0 -0
  63. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/biolib_errors.py +0 -0
  64. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/biolib_logging.py +0 -0
  65. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/cli/__init__.py +0 -0
  66. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/cli/auth.py +0 -0
  67. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/cli/data_record.py +0 -0
  68. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/cli/download_container.py +0 -0
  69. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/cli/init.py +0 -0
  70. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/cli/lfs.py +0 -0
  71. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/cli/push.py +0 -0
  72. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/cli/run.py +0 -0
  73. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/cli/runtime.py +0 -0
  74. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/cli/start.py +0 -0
  75. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/compute_node/.gitignore +0 -0
  76. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/compute_node/__init__.py +0 -0
  77. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/compute_node/cloud_utils/__init__.py +0 -0
  78. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/compute_node/cloud_utils/cloud_utils.py +0 -0
  79. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/compute_node/job_worker/__init__.py +0 -0
  80. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/compute_node/job_worker/cache_state.py +0 -0
  81. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/compute_node/job_worker/cache_types.py +0 -0
  82. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/compute_node/job_worker/docker_image_cache.py +0 -0
  83. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/compute_node/job_worker/executors/__init__.py +0 -0
  84. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/compute_node/job_worker/executors/docker_executor.py +0 -0
  85. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/compute_node/job_worker/executors/docker_types.py +0 -0
  86. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/compute_node/job_worker/executors/tars/__init__.py +0 -0
  87. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/compute_node/job_worker/executors/types.py +0 -0
  88. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/compute_node/job_worker/job_legacy_input_wait_timeout_thread.py +0 -0
  89. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/compute_node/job_worker/job_max_runtime_timer_thread.py +0 -0
  90. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/compute_node/job_worker/job_storage.py +0 -0
  91. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/compute_node/job_worker/job_worker.py +0 -0
  92. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/compute_node/job_worker/large_file_system.py +0 -0
  93. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/compute_node/job_worker/mappings.py +0 -0
  94. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/compute_node/job_worker/utilization_reporter_thread.py +0 -0
  95. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/compute_node/job_worker/utils.py +0 -0
  96. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/compute_node/socker_listener_thread.py +0 -0
  97. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/compute_node/socket_sender_thread.py +0 -0
  98. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/compute_node/utils.py +0 -0
  99. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/compute_node/webserver/__init__.py +0 -0
  100. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/compute_node/webserver/gunicorn_flask_application.py +0 -0
  101. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/compute_node/webserver/webserver.py +0 -0
  102. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/compute_node/webserver/webserver_types.py +0 -0
  103. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/compute_node/webserver/webserver_utils.py +0 -0
  104. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/compute_node/webserver/worker_thread.py +0 -0
  105. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/experiments/__init__.py +0 -0
  106. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/experiments/experiment.py +0 -0
  107. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/jobs/__init__.py +0 -0
  108. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/jobs/job.py +0 -0
  109. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/jobs/job_result.py +0 -0
  110. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/jobs/types.py +0 -0
  111. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/runtime/__init__.py +0 -0
  112. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/sdk/__init__.py +0 -0
  113. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/tables.py +0 -0
  114. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/templates/__init__.py +0 -0
  115. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/templates/example_app.py +0 -0
  116. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/typing_utils.py +0 -0
  117. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/user/__init__.py +0 -0
  118. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/user/sign_in.py +0 -0
  119. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/utils/__init__.py +0 -0
  120. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/utils/app_uri.py +0 -0
  121. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/utils/cache_state.py +0 -0
  122. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/utils/multipart_uploader.py +0 -0
  123. {pybiolib-1.2.166 → pybiolib-1.2.174}/biolib/utils/seq_util.py +0 -0
  124. {pybiolib-1.2.166 → pybiolib-1.2.174}/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.2.166
3
+ Version: 1.2.174
4
4
  Summary: BioLib Python Client
5
5
  Home-page: https://github.com/biolib
6
6
  License: MIT
@@ -1,10 +1,9 @@
1
1
  import os
2
2
  from collections import namedtuple
3
3
  from datetime import datetime
4
- from fnmatch import fnmatch
5
4
  from pathlib import Path
6
5
  from struct import Struct
7
- from typing import Callable, Dict, List, Optional, Union, cast
6
+ from typing import Callable, Dict, Iterable, List, Optional, Union, cast
8
7
 
9
8
  from biolib import api
10
9
  from biolib._internal import types
@@ -16,6 +15,7 @@ from biolib._internal.data_record.push_data import (
16
15
  )
17
16
  from biolib._internal.data_record.remote_storage_endpoint import DataRecordRemoteStorageEndpoint
18
17
  from biolib._internal.http_client import HttpClient
18
+ from biolib._internal.types.file_node import ZipFileNodeDict
19
19
  from biolib.api import client as api_client
20
20
  from biolib.biolib_api_client import BiolibApiClient
21
21
  from biolib.biolib_api_client.lfs_types import DataRecordInfo, DataRecordVersion, DataRecordVersionInfo
@@ -23,9 +23,8 @@ from biolib.biolib_binary_format import LazyLoadedFile
23
23
  from biolib.biolib_binary_format.utils import RemoteIndexableBuffer
24
24
  from biolib.biolib_logging import logger
25
25
  from biolib.utils.app_uri import parse_app_uri
26
- from biolib.utils.zip.remote_zip import RemoteZip
27
26
 
28
- PathFilter = Union[str, Callable[[str], bool]]
27
+ PathFilter = Union[str, List[str], Callable[[str], bool]]
29
28
 
30
29
 
31
30
  class DataRecord:
@@ -51,17 +50,25 @@ class DataRecord:
51
50
 
52
51
  return uri_parsed['app_name']
53
52
 
54
- def list_files(self, path_filter: Optional[PathFilter] = None) -> List[LazyLoadedFile]:
55
- remote_storage_endpoint = DataRecordRemoteStorageEndpoint(
56
- resource_version_uuid=self._state['resource_version_uuid'],
53
+ def list_files(
54
+ self,
55
+ path_filter: Optional[PathFilter] = None,
56
+ max_count: Optional[int] = 100_000,
57
+ ) -> List[LazyLoadedFile]:
58
+ files = list(
59
+ self._fetch_files(
60
+ path_filter=path_filter,
61
+ max_count=max_count + 1 if max_count is not None else None,
62
+ )
57
63
  )
58
- files: List[LazyLoadedFile] = []
59
- with RemoteZip(url=remote_storage_endpoint.get_remote_url()) as remote_zip:
60
- central_directory = remote_zip.get_central_directory()
61
- for file_info in central_directory.values():
62
- files.append(self._get_file(remote_storage_endpoint, file_info))
63
64
 
64
- return self._get_filtered_files(files=files, path_filter=path_filter) if path_filter else files
65
+ if max_count is not None and len(files) > max_count:
66
+ raise Exception(
67
+ f'list_files returned more than {max_count} files. '
68
+ f'Please set the keyword argument "max_count" to a higher number.'
69
+ )
70
+
71
+ return files
65
72
 
66
73
  def download_zip(self, output_path: str):
67
74
  remote_storage_endpoint = DataRecordRemoteStorageEndpoint(
@@ -188,8 +195,50 @@ class DataRecord:
188
195
  for result in results
189
196
  ]
190
197
 
198
+ def _fetch_files(
199
+ self,
200
+ max_count: Optional[int],
201
+ path_filter: Optional[PathFilter] = None,
202
+ ) -> Iterable[LazyLoadedFile]:
203
+ if path_filter and not (isinstance(path_filter, (str, list)) or callable(path_filter)):
204
+ raise Exception('Expected path_filter to be a string, a list of strings or a function')
205
+
206
+ path_filters = (
207
+ [path_filter] if isinstance(path_filter, str) else path_filter if isinstance(path_filter, list) else []
208
+ )
209
+
210
+ resource_version_uuid = self._state['resource_version_uuid']
211
+ remote_storage_endpoint = DataRecordRemoteStorageEndpoint(resource_version_uuid)
212
+
213
+ page: Optional[int] = 1
214
+ yielded_files: int = 0
215
+ while page:
216
+ response = api.client.post(
217
+ path=f'/proxy/files/data-record-versions/{resource_version_uuid}/query/',
218
+ data=dict(page=page, page_size=1_000, path_filters=path_filters),
219
+ ).json()
220
+
221
+ for file_node_dict in cast(List[ZipFileNodeDict], response['results']):
222
+ if file_node_dict['is_dir']:
223
+ continue
224
+
225
+ if callable(path_filter) and not path_filter(file_node_dict['dir_path'] + file_node_dict['name']):
226
+ continue
227
+
228
+ yield self._get_file(remote_storage_endpoint, file_node_dict)
229
+ yielded_files += 1
230
+
231
+ if max_count is not None and yielded_files >= max_count:
232
+ page = None
233
+ break
234
+
235
+ page = page + 1 if page is not None and response['page_count'] > page else None
236
+
191
237
  @staticmethod
192
- def _get_file(remote_storage_endpoint: DataRecordRemoteStorageEndpoint, file_info: Dict) -> LazyLoadedFile:
238
+ def _get_file(
239
+ remote_storage_endpoint: DataRecordRemoteStorageEndpoint,
240
+ file_node_dict: ZipFileNodeDict,
241
+ ) -> LazyLoadedFile:
193
242
  local_file_header_signature_bytes = b'\x50\x4b\x03\x04'
194
243
  local_file_header_struct = Struct('<H2sHHHIIIHH')
195
244
  LocalFileHeader = namedtuple(
@@ -208,7 +257,7 @@ class DataRecord:
208
257
  ),
209
258
  )
210
259
 
211
- local_file_header_start = file_info['header_offset'] + len(local_file_header_signature_bytes)
260
+ local_file_header_start = file_node_dict['zip_meta']['header_start'] + len(local_file_header_signature_bytes)
212
261
  local_file_header_end = local_file_header_start + local_file_header_struct.size
213
262
 
214
263
  def file_start_func() -> int:
@@ -227,26 +276,11 @@ class DataRecord:
227
276
 
228
277
  return LazyLoadedFile(
229
278
  buffer=RemoteIndexableBuffer(endpoint=remote_storage_endpoint),
230
- length=file_info['file_size'],
231
- path=file_info['filename'],
279
+ length=file_node_dict['zip_meta']['size_on_disk'],
280
+ path=file_node_dict['dir_path'] + file_node_dict['name'],
232
281
  start=None,
233
282
  start_func=file_start_func,
234
283
  )
235
284
 
236
- @staticmethod
237
- def _get_filtered_files(files: List[LazyLoadedFile], path_filter: PathFilter) -> List[LazyLoadedFile]:
238
- if not (isinstance(path_filter, str) or callable(path_filter)):
239
- raise Exception('Expected path_filter to be a string or a function')
240
-
241
- if callable(path_filter):
242
- return list(filter(lambda x: path_filter(x.path), files)) # type: ignore
243
-
244
- glob_filter = cast(str, path_filter)
245
-
246
- def _filter_function(file: LazyLoadedFile) -> bool:
247
- return fnmatch(file.path, glob_filter)
248
-
249
- return list(filter(_filter_function, files))
250
-
251
285
  def _get_detailed_dict(self) -> types.DataRecordDetailedDict:
252
286
  return cast(types.DataRecordDetailedDict, api_client.get(f'/resources/data-records/{self.uuid}/').json())
@@ -0,0 +1,17 @@
1
+ from .typing import TypedDict
2
+
3
+
4
+ class FileZipMetadataDict(TypedDict):
5
+ header_start: int
6
+ size_on_disk: int
7
+
8
+
9
+ class FileNodeDict(TypedDict):
10
+ dir_path: str
11
+ is_dir: bool
12
+ name: str
13
+ size: int
14
+
15
+
16
+ class ZipFileNodeDict(FileNodeDict):
17
+ zip_meta: FileZipMetadataDict
@@ -309,6 +309,15 @@ http {{
309
309
  proxy_ssl_server_name on;
310
310
  }}
311
311
 
312
+ location /api/proxy/files/data-record-versions/ {{
313
+ proxy_pass https://$upstream_hostname$request_uri;
314
+ proxy_set_header authorization "";
315
+ proxy_set_header compute-node-auth-token "{compute_node_auth_token}";
316
+ proxy_set_header job-uuid "{self._job_uuid}";
317
+ proxy_set_header cookie "";
318
+ proxy_ssl_server_name on;
319
+ }}
320
+
312
321
  location /api/ {{
313
322
  proxy_pass https://$upstream_hostname$request_uri;
314
323
  proxy_set_header authorization "";
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "pybiolib"
3
- version = "1.2.166"
3
+ version = "1.2.174"
4
4
  description = "BioLib Python Client"
5
5
  readme = "PYPI_README.md"
6
6
  license = "MIT"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes