pybiolib 1.2.876__tar.gz → 1.2.878__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 (146) hide show
  1. {pybiolib-1.2.876 → pybiolib-1.2.878}/PKG-INFO +1 -1
  2. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/push_application.py +77 -0
  3. {pybiolib-1.2.876 → pybiolib-1.2.878}/pyproject.toml +1 -1
  4. {pybiolib-1.2.876 → pybiolib-1.2.878}/LICENSE +0 -0
  5. {pybiolib-1.2.876 → pybiolib-1.2.878}/PYPI_README.md +0 -0
  6. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/__init__.py +0 -0
  7. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_data_record/data_record.py +0 -0
  8. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/__init__.py +0 -0
  9. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/add_copilot_prompts.py +0 -0
  10. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/data_record/__init__.py +0 -0
  11. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/data_record/data_record.py +0 -0
  12. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/data_record/push_data.py +0 -0
  13. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/data_record/remote_storage_endpoint.py +0 -0
  14. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/file_utils.py +0 -0
  15. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/fuse_mount/__init__.py +0 -0
  16. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/fuse_mount/experiment_fuse_mount.py +0 -0
  17. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/http_client.py +0 -0
  18. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/lfs/__init__.py +0 -0
  19. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/lfs/cache.py +0 -0
  20. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/libs/__init__.py +0 -0
  21. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/libs/fusepy/__init__.py +0 -0
  22. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/llm_instructions/.github/instructions/general-app-knowledge.instructions.md +0 -0
  23. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/llm_instructions/.github/instructions/style-general.instructions.md +0 -0
  24. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/llm_instructions/.github/instructions/style-python.instructions.md +0 -0
  25. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/llm_instructions/.github/instructions/style-react-ts.instructions.md +0 -0
  26. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/llm_instructions/.github/prompts/biolib_app_inputs.prompt.md +0 -0
  27. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/llm_instructions/.github/prompts/biolib_run_apps.prompt.md +0 -0
  28. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/llm_instructions/__init__.py +0 -0
  29. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/runtime.py +0 -0
  30. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/templates/__init__.py +0 -0
  31. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/templates/init_template/.biolib/config.yml +0 -0
  32. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/templates/init_template/.github/workflows/biolib.yml +0 -0
  33. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/templates/init_template/.gitignore +0 -0
  34. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/templates/init_template/Dockerfile +0 -0
  35. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/templates/init_template/requirements.txt +0 -0
  36. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/templates/init_template/run.py +0 -0
  37. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/templates/init_template/run.sh +0 -0
  38. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/templates/templates.py +0 -0
  39. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/tree_utils.py +0 -0
  40. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/types/__init__.py +0 -0
  41. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/types/app.py +0 -0
  42. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/types/data_record.py +0 -0
  43. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/types/experiment.py +0 -0
  44. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/types/file_node.py +0 -0
  45. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/types/push.py +0 -0
  46. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/types/resource.py +0 -0
  47. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/types/resource_permission.py +0 -0
  48. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/types/resource_version.py +0 -0
  49. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/types/result.py +0 -0
  50. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/types/typing.py +0 -0
  51. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/utils/__init__.py +0 -0
  52. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_internal/utils/multinode.py +0 -0
  53. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_runtime/runtime.py +0 -0
  54. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/_session/session.py +0 -0
  55. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/api/__init__.py +0 -0
  56. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/api/client.py +0 -0
  57. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/app/__init__.py +0 -0
  58. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/app/app.py +0 -0
  59. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/app/search_apps.py +0 -0
  60. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/biolib_api_client/__init__.py +0 -0
  61. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/biolib_api_client/api_client.py +0 -0
  62. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/biolib_api_client/app_types.py +0 -0
  63. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/biolib_api_client/auth.py +0 -0
  64. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/biolib_api_client/biolib_app_api.py +0 -0
  65. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/biolib_api_client/biolib_job_api.py +0 -0
  66. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/biolib_api_client/common_types.py +0 -0
  67. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/biolib_api_client/job_types.py +0 -0
  68. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/biolib_api_client/lfs_types.py +0 -0
  69. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/biolib_api_client/user_state.py +0 -0
  70. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/biolib_binary_format/__init__.py +0 -0
  71. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/biolib_binary_format/base_bbf_package.py +0 -0
  72. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/biolib_binary_format/file_in_container.py +0 -0
  73. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/biolib_binary_format/module_input.py +0 -0
  74. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/biolib_binary_format/module_output_v2.py +0 -0
  75. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/biolib_binary_format/remote_endpoints.py +0 -0
  76. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/biolib_binary_format/remote_stream_seeker.py +0 -0
  77. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/biolib_binary_format/saved_job.py +0 -0
  78. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/biolib_binary_format/stdout_and_stderr.py +0 -0
  79. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/biolib_binary_format/system_exception.py +0 -0
  80. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/biolib_binary_format/system_status_update.py +0 -0
  81. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/biolib_binary_format/utils.py +0 -0
  82. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/biolib_docker_client/__init__.py +0 -0
  83. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/biolib_download_container.py +0 -0
  84. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/biolib_errors.py +0 -0
  85. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/biolib_logging.py +0 -0
  86. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/cli/__init__.py +0 -0
  87. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/cli/auth.py +0 -0
  88. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/cli/data_record.py +0 -0
  89. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/cli/download_container.py +0 -0
  90. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/cli/init.py +0 -0
  91. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/cli/lfs.py +0 -0
  92. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/cli/push.py +0 -0
  93. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/cli/run.py +0 -0
  94. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/cli/runtime.py +0 -0
  95. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/cli/sdk.py +0 -0
  96. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/cli/start.py +0 -0
  97. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/compute_node/.gitignore +0 -0
  98. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/compute_node/__init__.py +0 -0
  99. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/compute_node/cloud_utils/__init__.py +0 -0
  100. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/compute_node/cloud_utils/cloud_utils.py +0 -0
  101. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/compute_node/job_worker/__init__.py +0 -0
  102. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/compute_node/job_worker/cache_state.py +0 -0
  103. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/compute_node/job_worker/cache_types.py +0 -0
  104. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/compute_node/job_worker/docker_image_cache.py +0 -0
  105. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/compute_node/job_worker/executors/__init__.py +0 -0
  106. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/compute_node/job_worker/executors/docker_executor.py +0 -0
  107. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/compute_node/job_worker/executors/docker_types.py +0 -0
  108. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/compute_node/job_worker/executors/tars/__init__.py +0 -0
  109. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/compute_node/job_worker/executors/types.py +0 -0
  110. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/compute_node/job_worker/job_legacy_input_wait_timeout_thread.py +0 -0
  111. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/compute_node/job_worker/job_max_runtime_timer_thread.py +0 -0
  112. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/compute_node/job_worker/job_storage.py +0 -0
  113. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/compute_node/job_worker/job_worker.py +0 -0
  114. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/compute_node/job_worker/large_file_system.py +0 -0
  115. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/compute_node/job_worker/mappings.py +0 -0
  116. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/compute_node/job_worker/utilization_reporter_thread.py +0 -0
  117. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/compute_node/job_worker/utils.py +0 -0
  118. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/compute_node/remote_host_proxy.py +0 -0
  119. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/compute_node/socker_listener_thread.py +0 -0
  120. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/compute_node/socket_sender_thread.py +0 -0
  121. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/compute_node/utils.py +0 -0
  122. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/compute_node/webserver/__init__.py +0 -0
  123. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/compute_node/webserver/gunicorn_flask_application.py +0 -0
  124. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/compute_node/webserver/webserver.py +0 -0
  125. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/compute_node/webserver/webserver_types.py +0 -0
  126. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/compute_node/webserver/webserver_utils.py +0 -0
  127. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/compute_node/webserver/worker_thread.py +0 -0
  128. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/experiments/__init__.py +0 -0
  129. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/experiments/experiment.py +0 -0
  130. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/jobs/__init__.py +0 -0
  131. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/jobs/job.py +0 -0
  132. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/jobs/job_result.py +0 -0
  133. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/jobs/types.py +0 -0
  134. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/py.typed +0 -0
  135. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/runtime/__init__.py +0 -0
  136. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/sdk/__init__.py +0 -0
  137. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/tables.py +0 -0
  138. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/typing_utils.py +0 -0
  139. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/user/__init__.py +0 -0
  140. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/user/sign_in.py +0 -0
  141. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/utils/__init__.py +0 -0
  142. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/utils/app_uri.py +0 -0
  143. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/utils/cache_state.py +0 -0
  144. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/utils/multipart_uploader.py +0 -0
  145. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/utils/seq_util.py +0 -0
  146. {pybiolib-1.2.876 → pybiolib-1.2.878}/biolib/utils/zip/remote_zip.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: pybiolib
3
- Version: 1.2.876
3
+ Version: 1.2.878
4
4
  Summary: BioLib Python Client
5
5
  License: MIT
6
6
  Keywords: biolib
@@ -1,5 +1,7 @@
1
1
  import os
2
2
  import re
3
+ import sys
4
+ import time
3
5
  from pathlib import Path
4
6
 
5
7
  import rich.progress
@@ -36,6 +38,13 @@ class DockerStatusUpdate(TypedDict, total=False):
36
38
 
37
39
 
38
40
  def process_docker_status_updates(status_updates: Iterable[DockerStatusUpdate], action: str) -> None:
41
+ if sys.stdout.isatty():
42
+ _process_docker_status_updates_with_progress_bar(status_updates, action)
43
+ else:
44
+ _process_docker_status_updates_with_logging(status_updates, action)
45
+
46
+
47
+ def _process_docker_status_updates_with_progress_bar(status_updates: Iterable[DockerStatusUpdate], action: str) -> None:
39
48
  with rich.progress.Progress() as progress:
40
49
  layer_id_to_task_id = {}
41
50
  overall_task_id = progress.add_task(description=f'[bold blue]{action} Docker image', total=None)
@@ -97,6 +106,74 @@ def process_docker_status_updates(status_updates: Iterable[DockerStatusUpdate],
97
106
  print(update)
98
107
 
99
108
 
109
+ def _process_docker_status_updates_with_logging(status_updates: Iterable[DockerStatusUpdate], action: str) -> None:
110
+ layer_progress = {}
111
+ layer_status = {}
112
+ last_log_time = time.time()
113
+
114
+ logger.info(f'{action} Docker image...')
115
+
116
+ for update in status_updates:
117
+ current_time = time.time()
118
+
119
+ if 'progressDetail' in update and 'id' in update:
120
+ layer_id = update['id']
121
+ progress_detail = update['progressDetail']
122
+
123
+ if progress_detail and 'current' in progress_detail and 'total' in progress_detail:
124
+ current = progress_detail['current']
125
+ total = progress_detail['total']
126
+ percentage = (current / total * 100) if total > 0 else 0
127
+ layer_progress[layer_id] = percentage
128
+ layer_status[layer_id] = f'{action.lower()}'
129
+ elif update.get('status') == 'Layer already exists':
130
+ layer_progress[layer_id] = 100
131
+ layer_status[layer_id] = 'already exists'
132
+
133
+ elif 'status' in update and 'id' in update:
134
+ layer_id = update['id']
135
+ status = update['status']
136
+ layer_status[layer_id] = status.lower()
137
+
138
+ if status in ['Pushed', 'Uploaded'] or status == 'Layer already exists':
139
+ layer_progress[layer_id] = 100
140
+
141
+ elif 'status' in update and update['status']:
142
+ status = update['status']
143
+ if status not in ['Preparing', 'Pushing', 'Pushed', 'Waiting', 'Layer already exists']:
144
+ logger.info(f'{action} Docker image - {status}')
145
+
146
+ if current_time - last_log_time >= 10.0:
147
+ _log_progress_summary(action, layer_progress, layer_status)
148
+ last_log_time = current_time
149
+
150
+ _log_progress_summary(action, layer_progress, layer_status)
151
+ logger.info(f'{action} Docker image completed')
152
+
153
+
154
+ def _log_progress_summary(action: str, layer_progress: dict, layer_status: dict) -> None:
155
+ if not layer_progress and not layer_status:
156
+ return
157
+
158
+ completed_layers = sum(1 for progress in layer_progress.values() if progress >= 100)
159
+ total_layers = len(layer_progress) if layer_progress else len(layer_status)
160
+
161
+ if total_layers > 0:
162
+ overall_percentage = completed_layers / total_layers * 100
163
+ logger.info(
164
+ f'{action} progress: {completed_layers}/{total_layers} layers completed ({overall_percentage:.1f}%)'
165
+ )
166
+
167
+ active_layers = [
168
+ layer_id
169
+ for layer_id, status in layer_status.items()
170
+ if status in ['preparing', 'waiting', 'pushing', 'uploading'] and layer_progress.get(layer_id, 0) < 100
171
+ ]
172
+
173
+ if active_layers:
174
+ logger.info(f'Active layers: {", ".join(active_layers[:5])}{"..." if len(active_layers) > 5 else ""}')
175
+
176
+
100
177
  def set_app_version_as_active(
101
178
  app_version_uuid: str,
102
179
  ):
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "pybiolib"
3
- version = "1.2.876"
3
+ version = "1.2.878"
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
File without changes
File without changes