pybiolib 1.1.1794__tar.gz → 1.1.1810__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 (109) hide show
  1. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/PKG-INFO +1 -1
  2. pybiolib-1.1.1810/biolib/_internal/utils/__init__.py +14 -0
  3. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/cli/auth.py +10 -2
  4. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/cli/download_container.py +1 -1
  5. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/jobs/job.py +27 -28
  6. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/user/sign_in.py +8 -12
  7. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/pyproject.toml +1 -1
  8. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/LICENSE +0 -0
  9. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/README.md +0 -0
  10. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/__init__.py +0 -0
  11. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/_internal/__init__.py +0 -0
  12. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/_internal/http_client.py +0 -0
  13. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/_internal/push_application.py +0 -0
  14. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/_internal/runtime/__init__.py +0 -0
  15. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/_internal/runtime/job_data.py +0 -0
  16. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/api/__init__.py +0 -0
  17. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/api/client.py +0 -0
  18. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/app/__init__.py +0 -0
  19. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/app/app.py +0 -0
  20. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/app/search_apps.py +0 -0
  21. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/biolib_api_client/__init__.py +0 -0
  22. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/biolib_api_client/api_client.py +0 -0
  23. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/biolib_api_client/app_types.py +0 -0
  24. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/biolib_api_client/auth.py +0 -0
  25. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/biolib_api_client/biolib_account_api.py +0 -0
  26. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/biolib_api_client/biolib_app_api.py +0 -0
  27. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/biolib_api_client/biolib_job_api.py +0 -0
  28. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/biolib_api_client/biolib_large_file_system_api.py +0 -0
  29. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/biolib_api_client/common_types.py +0 -0
  30. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/biolib_api_client/job_types.py +0 -0
  31. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/biolib_api_client/lfs_types.py +0 -0
  32. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/biolib_api_client/user_state.py +0 -0
  33. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/biolib_binary_format/__init__.py +0 -0
  34. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/biolib_binary_format/base_bbf_package.py +0 -0
  35. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/biolib_binary_format/file_in_container.py +0 -0
  36. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/biolib_binary_format/module_input.py +0 -0
  37. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/biolib_binary_format/module_output_v2.py +0 -0
  38. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/biolib_binary_format/remote_endpoints.py +0 -0
  39. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/biolib_binary_format/remote_stream_seeker.py +0 -0
  40. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/biolib_binary_format/saved_job.py +0 -0
  41. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/biolib_binary_format/stdout_and_stderr.py +0 -0
  42. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/biolib_binary_format/system_exception.py +0 -0
  43. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/biolib_binary_format/system_status_update.py +0 -0
  44. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/biolib_binary_format/utils.py +0 -0
  45. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/biolib_docker_client/__init__.py +0 -0
  46. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/biolib_download_container.py +0 -0
  47. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/biolib_errors.py +0 -0
  48. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/biolib_logging.py +0 -0
  49. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/cli/__init__.py +0 -0
  50. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/cli/init.py +0 -0
  51. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/cli/lfs.py +0 -0
  52. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/cli/push.py +0 -0
  53. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/cli/run.py +0 -0
  54. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/cli/runtime.py +0 -0
  55. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/cli/start.py +0 -0
  56. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/compute_node/.gitignore +0 -0
  57. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/compute_node/__init__.py +0 -0
  58. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/compute_node/cloud_utils/__init__.py +0 -0
  59. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/compute_node/cloud_utils/cloud_utils.py +0 -0
  60. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/compute_node/job_worker/__init__.py +0 -0
  61. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/compute_node/job_worker/cache_state.py +0 -0
  62. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/compute_node/job_worker/cache_types.py +0 -0
  63. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/compute_node/job_worker/docker_image_cache.py +0 -0
  64. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/compute_node/job_worker/executors/__init__.py +0 -0
  65. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/compute_node/job_worker/executors/docker_executor.py +0 -0
  66. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/compute_node/job_worker/executors/docker_types.py +0 -0
  67. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/compute_node/job_worker/executors/tars/__init__.py +0 -0
  68. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/compute_node/job_worker/executors/types.py +0 -0
  69. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/compute_node/job_worker/job_legacy_input_wait_timeout_thread.py +0 -0
  70. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/compute_node/job_worker/job_max_runtime_timer_thread.py +0 -0
  71. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/compute_node/job_worker/job_storage.py +0 -0
  72. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/compute_node/job_worker/job_worker.py +0 -0
  73. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/compute_node/job_worker/large_file_system.py +0 -0
  74. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/compute_node/job_worker/mappings.py +0 -0
  75. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/compute_node/job_worker/utilization_reporter_thread.py +0 -0
  76. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/compute_node/job_worker/utils.py +0 -0
  77. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/compute_node/remote_host_proxy.py +0 -0
  78. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/compute_node/socker_listener_thread.py +0 -0
  79. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/compute_node/socket_sender_thread.py +0 -0
  80. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/compute_node/utils.py +0 -0
  81. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/compute_node/webserver/__init__.py +0 -0
  82. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/compute_node/webserver/gunicorn_flask_application.py +0 -0
  83. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/compute_node/webserver/webserver.py +0 -0
  84. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/compute_node/webserver/webserver_types.py +0 -0
  85. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/compute_node/webserver/webserver_utils.py +0 -0
  86. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/compute_node/webserver/worker_thread.py +0 -0
  87. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/experiments/__init__.py +0 -0
  88. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/experiments/experiment.py +0 -0
  89. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/experiments/types.py +0 -0
  90. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/jobs/__init__.py +0 -0
  91. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/jobs/job_result.py +0 -0
  92. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/jobs/types.py +0 -0
  93. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/lfs/__init__.py +0 -0
  94. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/lfs/cache.py +0 -0
  95. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/lfs/utils.py +0 -0
  96. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/runtime/__init__.py +0 -0
  97. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/runtime/results.py +0 -0
  98. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/sdk/__init__.py +0 -0
  99. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/tables.py +0 -0
  100. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/templates/__init__.py +0 -0
  101. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/templates/example_app.py +0 -0
  102. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/typing_utils.py +0 -0
  103. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/user/__init__.py +0 -0
  104. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/utils/__init__.py +0 -0
  105. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/utils/app_uri.py +0 -0
  106. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/utils/cache_state.py +0 -0
  107. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/utils/multipart_uploader.py +0 -0
  108. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/biolib/utils/seq_util.py +0 -0
  109. {pybiolib-1.1.1794 → pybiolib-1.1.1810}/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.1794
3
+ Version: 1.1.1810
4
4
  Summary: BioLib Python Client
5
5
  Home-page: https://github.com/biolib
6
6
  License: MIT
@@ -0,0 +1,14 @@
1
+ import time
2
+ import uuid
3
+
4
+
5
+ def open_browser_window_from_notebook(url_to_open: str) -> None:
6
+ try:
7
+ from IPython.display import (display, Javascript, update_display) # type:ignore # pylint: disable=import-error, import-outside-toplevel
8
+ except ImportError as error:
9
+ raise Exception('Unexpected environment. This function can only be called from a notebook.') from error
10
+
11
+ display_id = str(uuid.uuid4())
12
+ display(Javascript(f'window.open("{url_to_open}");'), display_id=display_id)
13
+ time.sleep(1)
14
+ update_display(Javascript(''), display_id=display_id)
@@ -8,10 +8,18 @@ from biolib import biolib_errors, api
8
8
 
9
9
 
10
10
  @click.command(help='Login your to BioLib account with web browser')
11
- def login() -> None:
11
+ @click.option(
12
+ '-w',
13
+ is_flag=True,
14
+ default=False,
15
+ required=False,
16
+ type=bool,
17
+ help='Automatically open the login page in the default web browser',
18
+ )
19
+ def login(w: bool) -> None: # pylint: disable=invalid-name
12
20
  logger.configure(default_log_level=logging.INFO)
13
21
  logger_no_user_data.configure(default_log_level=logging.INFO)
14
- sign_in()
22
+ sign_in(open_in_default_browser=w)
15
23
 
16
24
 
17
25
  @click.command(help='Logout of your BioLib account')
@@ -4,7 +4,7 @@ from biolib.biolib_download_container import download_container_from_uri
4
4
  from biolib.biolib_logging import logger, logger_no_user_data
5
5
 
6
6
 
7
- @click.command(help='Push an application to BioLib', name='download-container')
7
+ @click.command(help='Pull an application from BioLib', name='download-container', hidden=True)
8
8
  @click.argument('uri')
9
9
  def download_container(uri: str) -> None:
10
10
  logger.configure(default_log_level=logging.INFO)
@@ -8,6 +8,8 @@ from urllib.parse import urlparse
8
8
 
9
9
  from biolib import api, utils
10
10
  from biolib._internal.http_client import HttpClient
11
+ from biolib._internal.utils import open_browser_window_from_notebook
12
+ from biolib.biolib_api_client import BiolibApiClient
11
13
  from biolib.biolib_api_client.biolib_job_api import BiolibJobApi
12
14
  from biolib.biolib_binary_format import LazyLoadedFile, ModuleOutputV2, ModuleInput, ModuleInputDict
13
15
  from biolib.biolib_binary_format.stdout_and_stderr import StdoutAndStderr
@@ -23,12 +25,14 @@ from biolib.utils import IS_RUNNING_IN_NOTEBOOK
23
25
 
24
26
  class Job:
25
27
  # Columns to print in table when showing Job
26
- table_columns_to_row_map = OrderedDict({
27
- 'ID': {'key': 'uuid', 'params': {'width': 36}},
28
- 'Application': {'key': 'app_uri', 'params': {}},
29
- 'Status': {'key': 'state', 'params': {}},
30
- 'Started At': {'key': 'started_at', 'params': {}},
31
- })
28
+ table_columns_to_row_map = OrderedDict(
29
+ {
30
+ 'ID': {'key': 'uuid', 'params': {'width': 36}},
31
+ 'Application': {'key': 'app_uri', 'params': {}},
32
+ 'Status': {'key': 'state', 'params': {}},
33
+ 'Started At': {'key': 'started_at', 'params': {}},
34
+ }
35
+ )
32
36
 
33
37
  def __init__(self, job_dict: JobDict):
34
38
  self._uuid: str = job_dict['uuid']
@@ -172,6 +176,17 @@ class Job:
172
176
  time.sleep(2)
173
177
  logger.info(f'Job {self.id} has finished.')
174
178
 
179
+ def open_browser(self) -> None:
180
+ api_client = BiolibApiClient.get()
181
+ results_url_to_open = f'{api_client.base_url}/results/{self.id}/?token={self._auth_token}'
182
+ if IS_RUNNING_IN_NOTEBOOK:
183
+ print(f'Opening results page at: {results_url_to_open}')
184
+ print('If your browser does not open automatically, click on the link above.')
185
+ open_browser_window_from_notebook(results_url_to_open)
186
+ else:
187
+ print('Please copy and paste the following link into your browser:')
188
+ print(results_url_to_open)
189
+
175
190
  def _get_cloud_job(self) -> CloudJobDict:
176
191
  self._refetch_job_dict(force_refetch=True)
177
192
  if self._job_dict['cloud_job'] is None:
@@ -190,20 +205,11 @@ class Job:
190
205
  @staticmethod
191
206
  def show_jobs(count: int = 25) -> None:
192
207
  job_dicts = Job._get_job_dicts(count)
193
- BioLibTable(
194
- columns_to_row_map=Job.table_columns_to_row_map,
195
- rows=job_dicts,
196
- title='Jobs'
197
- ).print_table()
208
+ BioLibTable(columns_to_row_map=Job.table_columns_to_row_map, rows=job_dicts, title='Jobs').print_table()
198
209
 
199
210
  @staticmethod
200
211
  def _get_job_dicts(count: int) -> List['JobDict']:
201
- job_dicts: List['JobDict'] = api.client.get(
202
- path='/jobs/',
203
- params={
204
- 'page_size': str(count)
205
- }
206
- ).json()['results']
212
+ job_dicts: List['JobDict'] = api.client.get(path='/jobs/', params={'page_size': str(count)}).json()['results']
207
213
  return job_dicts
208
214
 
209
215
  @staticmethod
@@ -235,9 +241,7 @@ class Job:
235
241
  def show(self) -> None:
236
242
  self._refetch_job_dict()
237
243
  BioLibTable(
238
- columns_to_row_map=Job.table_columns_to_row_map,
239
- rows=[self._job_dict],
240
- title=f'Job: {self._uuid}'
244
+ columns_to_row_map=Job.table_columns_to_row_map, rows=[self._job_dict], title=f'Job: {self._uuid}'
241
245
  ).print_table()
242
246
 
243
247
  def stream_logs(self) -> None:
@@ -305,9 +309,7 @@ class Job:
305
309
 
306
310
  def _print_full_logs(self, node_url: str) -> None:
307
311
  try:
308
- response_json = HttpClient.request(
309
- url=f'{node_url}/v1/job/{self._uuid}/status/?logs=full'
310
- ).json()
312
+ response_json = HttpClient.request(url=f'{node_url}/v1/job/{self._uuid}/status/?logs=full').json()
311
313
  except Exception as error:
312
314
  logger.error(f'Could not get full streamed logs due to: {error}')
313
315
  raise BioLibError('Could not get full streamed logs') from error
@@ -336,9 +338,7 @@ class Job:
336
338
  def _get_job_status_from_compute_node(self, compute_node_url):
337
339
  for _ in range(15):
338
340
  try:
339
- return HttpClient.request(
340
- url=f'{compute_node_url}/v1/job/{self._uuid}/status/'
341
- ).json()
341
+ return HttpClient.request(url=f'{compute_node_url}/v1/job/{self._uuid}/status/').json()
342
342
  except Exception: # pylint: disable=broad-except
343
343
  cloud_job = self._get_cloud_job()
344
344
  logger.debug("Failed to get status from compute node, retrying...")
@@ -346,8 +346,7 @@ class Job:
346
346
  logger.debug("Job no longer exists on compute node, checking for error...")
347
347
  if cloud_job['error_code'] != SystemExceptionCodes.COMPLETED_SUCCESSFULLY.value:
348
348
  error_message = SystemExceptionCodeMap.get(
349
- cloud_job['error_code'],
350
- f'Unknown error code {cloud_job["error_code"]}'
349
+ cloud_job['error_code'], f'Unknown error code {cloud_job["error_code"]}'
351
350
  )
352
351
  raise BioLibError(f'Cloud: {error_message}') from None
353
352
  else:
@@ -1,19 +1,11 @@
1
1
  import time
2
- import uuid
2
+ import webbrowser
3
3
 
4
4
  from biolib.biolib_api_client import BiolibApiClient
5
5
  from biolib.biolib_api_client.auth import BiolibAuthChallengeApi
6
6
  from biolib.biolib_logging import logger_no_user_data
7
7
  from biolib.utils import IS_RUNNING_IN_NOTEBOOK
8
-
9
-
10
- def _open_browser_window(url_to_open: str) -> None:
11
- from IPython.display import display, Javascript, update_display # type:ignore # pylint: disable=import-error, import-outside-toplevel
12
-
13
- display_id = str(uuid.uuid4())
14
- display(Javascript(f'window.open("{url_to_open}");'), display_id=display_id)
15
- time.sleep(1)
16
- update_display(Javascript(''), display_id=display_id)
8
+ from biolib._internal.utils import open_browser_window_from_notebook
17
9
 
18
10
 
19
11
  def sign_out() -> None:
@@ -21,7 +13,7 @@ def sign_out() -> None:
21
13
  api_client.sign_out()
22
14
 
23
15
 
24
- def sign_in() -> None:
16
+ def sign_in(open_in_default_browser: bool = False) -> None:
25
17
  api_client = BiolibApiClient.get()
26
18
  if api_client.is_signed_in:
27
19
  logger_no_user_data.info('Already signed in')
@@ -37,7 +29,11 @@ def sign_in() -> None:
37
29
  if IS_RUNNING_IN_NOTEBOOK:
38
30
  print(f'Opening authorization page at: {frontend_sign_in_url}')
39
31
  print('If your browser does not open automatically, click on the link above.')
40
- _open_browser_window(frontend_sign_in_url)
32
+ open_browser_window_from_notebook(frontend_sign_in_url)
33
+ elif open_in_default_browser:
34
+ print(f'Opening authorization page at: {frontend_sign_in_url}')
35
+ print('If your browser does not open automatically, click on the link above.')
36
+ webbrowser.open(frontend_sign_in_url)
41
37
  else:
42
38
  print('Please copy and paste the following link into your browser:')
43
39
  print(frontend_sign_in_url)
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "pybiolib"
3
- version = "1.1.1794"
3
+ version = "1.1.1810"
4
4
  description = "BioLib Python Client"
5
5
  readme = "README.md"
6
6
  license = "MIT"
File without changes
File without changes