pybiolib 1.2.874__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.874 → pybiolib-1.2.878}/PKG-INFO +1 -1
  2. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/push_application.py +76 -17
  3. {pybiolib-1.2.874 → pybiolib-1.2.878}/pyproject.toml +1 -1
  4. {pybiolib-1.2.874 → pybiolib-1.2.878}/LICENSE +0 -0
  5. {pybiolib-1.2.874 → pybiolib-1.2.878}/PYPI_README.md +0 -0
  6. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/__init__.py +0 -0
  7. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_data_record/data_record.py +0 -0
  8. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/__init__.py +0 -0
  9. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/add_copilot_prompts.py +0 -0
  10. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/data_record/__init__.py +0 -0
  11. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/data_record/data_record.py +0 -0
  12. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/data_record/push_data.py +0 -0
  13. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/data_record/remote_storage_endpoint.py +0 -0
  14. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/file_utils.py +0 -0
  15. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/fuse_mount/__init__.py +0 -0
  16. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/fuse_mount/experiment_fuse_mount.py +0 -0
  17. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/http_client.py +0 -0
  18. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/lfs/__init__.py +0 -0
  19. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/lfs/cache.py +0 -0
  20. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/libs/__init__.py +0 -0
  21. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/libs/fusepy/__init__.py +0 -0
  22. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/llm_instructions/.github/instructions/general-app-knowledge.instructions.md +0 -0
  23. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/llm_instructions/.github/instructions/style-general.instructions.md +0 -0
  24. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/llm_instructions/.github/instructions/style-python.instructions.md +0 -0
  25. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/llm_instructions/.github/instructions/style-react-ts.instructions.md +0 -0
  26. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/llm_instructions/.github/prompts/biolib_app_inputs.prompt.md +0 -0
  27. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/llm_instructions/.github/prompts/biolib_run_apps.prompt.md +0 -0
  28. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/llm_instructions/__init__.py +0 -0
  29. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/runtime.py +0 -0
  30. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/templates/__init__.py +0 -0
  31. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/templates/init_template/.biolib/config.yml +0 -0
  32. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/templates/init_template/.github/workflows/biolib.yml +0 -0
  33. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/templates/init_template/.gitignore +0 -0
  34. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/templates/init_template/Dockerfile +0 -0
  35. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/templates/init_template/requirements.txt +0 -0
  36. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/templates/init_template/run.py +0 -0
  37. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/templates/init_template/run.sh +0 -0
  38. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/templates/templates.py +0 -0
  39. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/tree_utils.py +0 -0
  40. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/types/__init__.py +0 -0
  41. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/types/app.py +0 -0
  42. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/types/data_record.py +0 -0
  43. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/types/experiment.py +0 -0
  44. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/types/file_node.py +0 -0
  45. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/types/push.py +0 -0
  46. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/types/resource.py +0 -0
  47. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/types/resource_permission.py +0 -0
  48. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/types/resource_version.py +0 -0
  49. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/types/result.py +0 -0
  50. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/types/typing.py +0 -0
  51. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/utils/__init__.py +0 -0
  52. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_internal/utils/multinode.py +0 -0
  53. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_runtime/runtime.py +0 -0
  54. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/_session/session.py +0 -0
  55. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/api/__init__.py +0 -0
  56. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/api/client.py +0 -0
  57. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/app/__init__.py +0 -0
  58. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/app/app.py +0 -0
  59. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/app/search_apps.py +0 -0
  60. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/biolib_api_client/__init__.py +0 -0
  61. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/biolib_api_client/api_client.py +0 -0
  62. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/biolib_api_client/app_types.py +0 -0
  63. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/biolib_api_client/auth.py +0 -0
  64. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/biolib_api_client/biolib_app_api.py +0 -0
  65. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/biolib_api_client/biolib_job_api.py +0 -0
  66. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/biolib_api_client/common_types.py +0 -0
  67. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/biolib_api_client/job_types.py +0 -0
  68. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/biolib_api_client/lfs_types.py +0 -0
  69. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/biolib_api_client/user_state.py +0 -0
  70. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/biolib_binary_format/__init__.py +0 -0
  71. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/biolib_binary_format/base_bbf_package.py +0 -0
  72. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/biolib_binary_format/file_in_container.py +0 -0
  73. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/biolib_binary_format/module_input.py +0 -0
  74. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/biolib_binary_format/module_output_v2.py +0 -0
  75. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/biolib_binary_format/remote_endpoints.py +0 -0
  76. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/biolib_binary_format/remote_stream_seeker.py +0 -0
  77. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/biolib_binary_format/saved_job.py +0 -0
  78. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/biolib_binary_format/stdout_and_stderr.py +0 -0
  79. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/biolib_binary_format/system_exception.py +0 -0
  80. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/biolib_binary_format/system_status_update.py +0 -0
  81. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/biolib_binary_format/utils.py +0 -0
  82. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/biolib_docker_client/__init__.py +0 -0
  83. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/biolib_download_container.py +0 -0
  84. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/biolib_errors.py +0 -0
  85. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/biolib_logging.py +0 -0
  86. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/cli/__init__.py +0 -0
  87. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/cli/auth.py +0 -0
  88. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/cli/data_record.py +0 -0
  89. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/cli/download_container.py +0 -0
  90. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/cli/init.py +0 -0
  91. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/cli/lfs.py +0 -0
  92. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/cli/push.py +0 -0
  93. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/cli/run.py +0 -0
  94. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/cli/runtime.py +0 -0
  95. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/cli/sdk.py +0 -0
  96. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/cli/start.py +0 -0
  97. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/compute_node/.gitignore +0 -0
  98. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/compute_node/__init__.py +0 -0
  99. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/compute_node/cloud_utils/__init__.py +0 -0
  100. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/compute_node/cloud_utils/cloud_utils.py +0 -0
  101. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/compute_node/job_worker/__init__.py +0 -0
  102. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/compute_node/job_worker/cache_state.py +0 -0
  103. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/compute_node/job_worker/cache_types.py +0 -0
  104. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/compute_node/job_worker/docker_image_cache.py +0 -0
  105. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/compute_node/job_worker/executors/__init__.py +0 -0
  106. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/compute_node/job_worker/executors/docker_executor.py +0 -0
  107. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/compute_node/job_worker/executors/docker_types.py +0 -0
  108. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/compute_node/job_worker/executors/tars/__init__.py +0 -0
  109. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/compute_node/job_worker/executors/types.py +0 -0
  110. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/compute_node/job_worker/job_legacy_input_wait_timeout_thread.py +0 -0
  111. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/compute_node/job_worker/job_max_runtime_timer_thread.py +0 -0
  112. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/compute_node/job_worker/job_storage.py +0 -0
  113. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/compute_node/job_worker/job_worker.py +0 -0
  114. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/compute_node/job_worker/large_file_system.py +0 -0
  115. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/compute_node/job_worker/mappings.py +0 -0
  116. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/compute_node/job_worker/utilization_reporter_thread.py +0 -0
  117. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/compute_node/job_worker/utils.py +0 -0
  118. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/compute_node/remote_host_proxy.py +0 -0
  119. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/compute_node/socker_listener_thread.py +0 -0
  120. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/compute_node/socket_sender_thread.py +0 -0
  121. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/compute_node/utils.py +0 -0
  122. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/compute_node/webserver/__init__.py +0 -0
  123. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/compute_node/webserver/gunicorn_flask_application.py +0 -0
  124. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/compute_node/webserver/webserver.py +0 -0
  125. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/compute_node/webserver/webserver_types.py +0 -0
  126. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/compute_node/webserver/webserver_utils.py +0 -0
  127. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/compute_node/webserver/worker_thread.py +0 -0
  128. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/experiments/__init__.py +0 -0
  129. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/experiments/experiment.py +0 -0
  130. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/jobs/__init__.py +0 -0
  131. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/jobs/job.py +0 -0
  132. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/jobs/job_result.py +0 -0
  133. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/jobs/types.py +0 -0
  134. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/py.typed +0 -0
  135. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/runtime/__init__.py +0 -0
  136. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/sdk/__init__.py +0 -0
  137. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/tables.py +0 -0
  138. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/typing_utils.py +0 -0
  139. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/user/__init__.py +0 -0
  140. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/user/sign_in.py +0 -0
  141. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/utils/__init__.py +0 -0
  142. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/utils/app_uri.py +0 -0
  143. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/utils/cache_state.py +0 -0
  144. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/utils/multipart_uploader.py +0 -0
  145. {pybiolib-1.2.874 → pybiolib-1.2.878}/biolib/utils/seq_util.py +0 -0
  146. {pybiolib-1.2.874 → 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.874
3
+ Version: 1.2.878
4
4
  Summary: BioLib Python Client
5
5
  License: MIT
6
6
  Keywords: biolib
@@ -1,11 +1,11 @@
1
1
  import os
2
2
  import re
3
3
  import sys
4
+ import time
4
5
  from pathlib import Path
5
6
 
6
7
  import rich.progress
7
8
  import yaml
8
- from rich.console import Console
9
9
 
10
10
  from biolib import api, utils
11
11
  from biolib._internal.data_record.push_data import (
@@ -38,9 +38,14 @@ class DockerStatusUpdate(TypedDict, total=False):
38
38
 
39
39
 
40
40
  def process_docker_status_updates(status_updates: Iterable[DockerStatusUpdate], action: str) -> None:
41
- console = Console(force_terminal=True, force_interactive=True, legacy_windows=False)
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)
42
45
 
43
- with rich.progress.Progress(console=console, refresh_per_second=20, transient=False) as progress:
46
+
47
+ def _process_docker_status_updates_with_progress_bar(status_updates: Iterable[DockerStatusUpdate], action: str) -> None:
48
+ with rich.progress.Progress() as progress:
44
49
  layer_id_to_task_id = {}
45
50
  overall_task_id = progress.add_task(description=f'[bold blue]{action} Docker image', total=None)
46
51
 
@@ -58,16 +63,12 @@ def process_docker_status_updates(status_updates: Iterable[DockerStatusUpdate],
58
63
  completed=progress_detail['current'],
59
64
  total=progress_detail['total'],
60
65
  )
61
- progress.refresh()
62
- sys.stdout.flush()
63
66
  elif update['status'] == 'Layer already exists':
64
67
  progress.update(
65
68
  completed=100,
66
69
  task_id=layer_id_to_task_id[layer_id],
67
70
  total=100,
68
71
  )
69
- progress.refresh()
70
- sys.stdout.flush()
71
72
  elif 'status' in update and 'id' in update:
72
73
  layer_id = update['id']
73
74
  status = update['status']
@@ -79,14 +80,10 @@ def process_docker_status_updates(status_updates: Iterable[DockerStatusUpdate],
79
80
  progress.update(
80
81
  task_id=layer_id_to_task_id[layer_id], description=f'[yellow]{status} layer {layer_id}'
81
82
  )
82
- progress.refresh()
83
- sys.stdout.flush()
84
83
  elif status in ['Pushing', 'Uploading']:
85
84
  progress.update(
86
85
  task_id=layer_id_to_task_id[layer_id], description=f'[cyan]{status} layer {layer_id}'
87
86
  )
88
- progress.refresh()
89
- sys.stdout.flush()
90
87
  elif status in ['Pushed', 'Uploaded']:
91
88
  progress.update(
92
89
  task_id=layer_id_to_task_id[layer_id],
@@ -94,8 +91,6 @@ def process_docker_status_updates(status_updates: Iterable[DockerStatusUpdate],
94
91
  completed=100,
95
92
  total=100,
96
93
  )
97
- progress.refresh()
98
- sys.stdout.flush()
99
94
  elif status == 'Layer already exists':
100
95
  progress.update(
101
96
  task_id=layer_id_to_task_id[layer_id],
@@ -103,18 +98,82 @@ def process_docker_status_updates(status_updates: Iterable[DockerStatusUpdate],
103
98
  completed=100,
104
99
  total=100,
105
100
  )
106
- progress.refresh()
107
- sys.stdout.flush()
108
101
  elif 'status' in update and update['status']:
109
102
  status = update['status']
110
103
  if status not in ['Preparing', 'Pushing', 'Pushed', 'Waiting', 'Layer already exists']:
111
104
  progress.update(task_id=overall_task_id, description=f'[bold blue]{action} Docker image - {status}')
112
- progress.refresh()
113
- sys.stdout.flush()
114
105
  elif 'status' not in update and 'progressDetail' not in update:
115
106
  print(update)
116
107
 
117
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
+
118
177
  def set_app_version_as_active(
119
178
  app_version_uuid: str,
120
179
  ):
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "pybiolib"
3
- version = "1.2.874"
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