pybiolib 1.2.1304__tar.gz → 1.2.1310__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.

Potentially problematic release.


This version of pybiolib might be problematic. Click here for more details.

Files changed (164) hide show
  1. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/PKG-INFO +1 -1
  2. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/push_application.py +56 -7
  3. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/jobs/job.py +7 -7
  4. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/pyproject.toml +1 -1
  5. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/LICENSE +0 -0
  6. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/PYPI_README.md +0 -0
  7. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/__init__.py +0 -0
  8. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_data_record/data_record.py +0 -0
  9. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/__init__.py +0 -0
  10. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/add_copilot_prompts.py +0 -0
  11. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/add_gui_files.py +0 -0
  12. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/data_record/__init__.py +0 -0
  13. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/data_record/data_record.py +0 -0
  14. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/data_record/push_data.py +0 -0
  15. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/data_record/remote_storage_endpoint.py +0 -0
  16. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/errors.py +0 -0
  17. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/file_utils.py +0 -0
  18. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/fuse_mount/__init__.py +0 -0
  19. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/fuse_mount/experiment_fuse_mount.py +0 -0
  20. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/http_client.py +0 -0
  21. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/lfs/__init__.py +0 -0
  22. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/lfs/cache.py +0 -0
  23. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/libs/__init__.py +0 -0
  24. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/libs/fusepy/__init__.py +0 -0
  25. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/runtime.py +0 -0
  26. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/string_utils.py +0 -0
  27. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/templates/__init__.py +0 -0
  28. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/templates/copilot_template/.github/instructions/general-app-knowledge.instructions.md +0 -0
  29. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/templates/copilot_template/.github/instructions/style-general.instructions.md +0 -0
  30. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/templates/copilot_template/.github/instructions/style-python.instructions.md +0 -0
  31. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/templates/copilot_template/.github/instructions/style-react-ts.instructions.md +0 -0
  32. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/templates/copilot_template/.github/prompts/biolib_app_inputs.prompt.md +0 -0
  33. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/templates/copilot_template/.github/prompts/biolib_onboard_repo.prompt.md +0 -0
  34. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/templates/copilot_template/.github/prompts/biolib_run_apps.prompt.md +0 -0
  35. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/templates/gui_template/.yarnrc.yml +0 -0
  36. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/templates/gui_template/App.tsx +0 -0
  37. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/templates/gui_template/Dockerfile +0 -0
  38. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/templates/gui_template/index.css +0 -0
  39. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/templates/gui_template/index.html +0 -0
  40. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/templates/gui_template/index.tsx +0 -0
  41. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/templates/gui_template/package.json +0 -0
  42. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/templates/gui_template/tsconfig.json +0 -0
  43. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/templates/gui_template/vite.config.mts +0 -0
  44. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/templates/init_template/.biolib/config.yml +0 -0
  45. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/templates/init_template/.github/workflows/biolib.yml +0 -0
  46. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/templates/init_template/.gitignore +0 -0
  47. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/templates/init_template/Dockerfile +0 -0
  48. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/templates/init_template/requirements.txt +0 -0
  49. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/templates/init_template/run.py +0 -0
  50. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/templates/init_template/run.sh +0 -0
  51. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/templates/templates.py +0 -0
  52. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/tree_utils.py +0 -0
  53. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/types/__init__.py +0 -0
  54. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/types/account.py +0 -0
  55. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/types/account_member.py +0 -0
  56. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/types/app.py +0 -0
  57. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/types/data_record.py +0 -0
  58. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/types/experiment.py +0 -0
  59. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/types/file_node.py +0 -0
  60. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/types/push.py +0 -0
  61. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/types/resource.py +0 -0
  62. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/types/resource_permission.py +0 -0
  63. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/types/resource_version.py +0 -0
  64. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/types/result.py +0 -0
  65. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/types/typing.py +0 -0
  66. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/types/user.py +0 -0
  67. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/utils/__init__.py +0 -0
  68. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/utils/job_url.py +0 -0
  69. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_internal/utils/multinode.py +0 -0
  70. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_runtime/runtime.py +0 -0
  71. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/_session/session.py +0 -0
  72. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/api/__init__.py +0 -0
  73. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/api/client.py +0 -0
  74. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/app/__init__.py +0 -0
  75. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/app/app.py +0 -0
  76. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/app/search_apps.py +0 -0
  77. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/biolib_api_client/__init__.py +0 -0
  78. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/biolib_api_client/api_client.py +0 -0
  79. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/biolib_api_client/app_types.py +0 -0
  80. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/biolib_api_client/auth.py +0 -0
  81. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/biolib_api_client/biolib_app_api.py +0 -0
  82. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/biolib_api_client/biolib_job_api.py +0 -0
  83. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/biolib_api_client/common_types.py +0 -0
  84. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/biolib_api_client/job_types.py +0 -0
  85. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/biolib_api_client/lfs_types.py +0 -0
  86. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/biolib_api_client/user_state.py +0 -0
  87. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/biolib_binary_format/__init__.py +0 -0
  88. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/biolib_binary_format/base_bbf_package.py +0 -0
  89. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/biolib_binary_format/file_in_container.py +0 -0
  90. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/biolib_binary_format/module_input.py +0 -0
  91. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/biolib_binary_format/module_output_v2.py +0 -0
  92. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/biolib_binary_format/remote_endpoints.py +0 -0
  93. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/biolib_binary_format/remote_stream_seeker.py +0 -0
  94. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/biolib_binary_format/saved_job.py +0 -0
  95. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/biolib_binary_format/stdout_and_stderr.py +0 -0
  96. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/biolib_binary_format/system_exception.py +0 -0
  97. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/biolib_binary_format/system_status_update.py +0 -0
  98. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/biolib_binary_format/utils.py +0 -0
  99. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/biolib_docker_client/__init__.py +0 -0
  100. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/biolib_download_container.py +0 -0
  101. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/biolib_errors.py +0 -0
  102. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/biolib_logging.py +0 -0
  103. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/cli/__init__.py +0 -0
  104. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/cli/auth.py +0 -0
  105. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/cli/data_record.py +0 -0
  106. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/cli/download_container.py +0 -0
  107. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/cli/init.py +0 -0
  108. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/cli/lfs.py +0 -0
  109. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/cli/push.py +0 -0
  110. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/cli/run.py +0 -0
  111. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/cli/runtime.py +0 -0
  112. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/cli/sdk.py +0 -0
  113. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/cli/start.py +0 -0
  114. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/compute_node/.gitignore +0 -0
  115. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/compute_node/__init__.py +0 -0
  116. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/compute_node/cloud_utils/__init__.py +0 -0
  117. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/compute_node/cloud_utils/cloud_utils.py +0 -0
  118. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/compute_node/job_worker/__init__.py +0 -0
  119. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/compute_node/job_worker/cache_state.py +0 -0
  120. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/compute_node/job_worker/cache_types.py +0 -0
  121. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/compute_node/job_worker/docker_image_cache.py +0 -0
  122. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/compute_node/job_worker/executors/__init__.py +0 -0
  123. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/compute_node/job_worker/executors/docker_executor.py +0 -0
  124. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/compute_node/job_worker/executors/docker_types.py +0 -0
  125. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/compute_node/job_worker/executors/tars/__init__.py +0 -0
  126. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/compute_node/job_worker/executors/types.py +0 -0
  127. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/compute_node/job_worker/job_legacy_input_wait_timeout_thread.py +0 -0
  128. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/compute_node/job_worker/job_max_runtime_timer_thread.py +0 -0
  129. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/compute_node/job_worker/job_storage.py +0 -0
  130. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/compute_node/job_worker/job_worker.py +0 -0
  131. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/compute_node/job_worker/large_file_system.py +0 -0
  132. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/compute_node/job_worker/mappings.py +0 -0
  133. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/compute_node/job_worker/utilization_reporter_thread.py +0 -0
  134. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/compute_node/job_worker/utils.py +0 -0
  135. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/compute_node/remote_host_proxy.py +0 -0
  136. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/compute_node/socker_listener_thread.py +0 -0
  137. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/compute_node/socket_sender_thread.py +0 -0
  138. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/compute_node/utils.py +0 -0
  139. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/compute_node/webserver/__init__.py +0 -0
  140. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/compute_node/webserver/compute_node_results_proxy.py +0 -0
  141. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/compute_node/webserver/gunicorn_flask_application.py +0 -0
  142. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/compute_node/webserver/proxy_utils.py +0 -0
  143. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/compute_node/webserver/webserver.py +0 -0
  144. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/compute_node/webserver/webserver_types.py +0 -0
  145. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/compute_node/webserver/webserver_utils.py +0 -0
  146. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/compute_node/webserver/worker_thread.py +0 -0
  147. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/experiments/__init__.py +0 -0
  148. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/experiments/experiment.py +0 -0
  149. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/jobs/__init__.py +0 -0
  150. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/jobs/job_result.py +0 -0
  151. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/jobs/types.py +0 -0
  152. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/py.typed +0 -0
  153. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/runtime/__init__.py +0 -0
  154. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/sdk/__init__.py +0 -0
  155. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/tables.py +0 -0
  156. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/typing_utils.py +0 -0
  157. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/user/__init__.py +0 -0
  158. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/user/sign_in.py +0 -0
  159. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/utils/__init__.py +0 -0
  160. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/utils/app_uri.py +0 -0
  161. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/utils/cache_state.py +0 -0
  162. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/utils/multipart_uploader.py +0 -0
  163. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/utils/seq_util.py +0 -0
  164. {pybiolib-1.2.1304 → pybiolib-1.2.1310}/biolib/utils/zip/remote_zip.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pybiolib
3
- Version: 1.2.1304
3
+ Version: 1.2.1310
4
4
  Summary: BioLib Python Client
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -21,7 +21,7 @@ from biolib.biolib_api_client.biolib_app_api import BiolibAppApi
21
21
  from biolib.biolib_docker_client import BiolibDockerClient
22
22
  from biolib.biolib_errors import BioLibError
23
23
  from biolib.biolib_logging import logger
24
- from biolib.typing_utils import Iterable, Optional, Set, TypedDict
24
+ from biolib.typing_utils import Dict, Iterable, Optional, Set, TypedDict
25
25
  from biolib.utils.app_uri import parse_app_uri
26
26
 
27
27
  REGEX_MARKDOWN_INLINE_IMAGE = re.compile(r'!\[(?P<alt>.*)\]\((?P<src>.*)\)')
@@ -109,8 +109,10 @@ def _process_docker_status_updates_with_progress_bar(status_updates: Iterable[Do
109
109
 
110
110
 
111
111
  def _process_docker_status_updates_with_logging(status_updates: Iterable[DockerStatusUpdate], action: str) -> None:
112
- layer_progress = {}
113
- layer_status = {}
112
+ layer_progress: Dict[str, float] = {}
113
+ layer_status: Dict[str, str] = {}
114
+ layer_details: Dict[str, Dict[str, int]] = {}
115
+ layer_bytes_at_last_log: Dict[str, int] = {}
114
116
  last_log_time = time.time()
115
117
 
116
118
  logger.info(f'{action} Docker image...')
@@ -128,6 +130,7 @@ def _process_docker_status_updates_with_logging(status_updates: Iterable[DockerS
128
130
  percentage = (current / total * 100) if total > 0 else 0
129
131
  layer_progress[layer_id] = percentage
130
132
  layer_status[layer_id] = f'{action.lower()}'
133
+ layer_details[layer_id] = {'current': current, 'total': total}
131
134
  elif update.get('status') == 'Layer already exists':
132
135
  layer_progress[layer_id] = 100
133
136
  layer_status[layer_id] = 'already exists'
@@ -146,16 +149,33 @@ def _process_docker_status_updates_with_logging(status_updates: Iterable[DockerS
146
149
  logger.info(f'{action} Docker image - {status}')
147
150
 
148
151
  if current_time - last_log_time >= 10.0:
149
- _log_progress_summary(action, layer_progress, layer_status)
152
+ _log_progress_summary(
153
+ action,
154
+ layer_progress,
155
+ layer_status,
156
+ layer_details,
157
+ layer_bytes_at_last_log,
158
+ current_time - last_log_time,
159
+ )
160
+ layer_bytes_at_last_log = {lid: details['current'] for lid, details in layer_details.items()}
150
161
  last_log_time = current_time
151
162
 
152
- _log_progress_summary(action, layer_progress, layer_status)
163
+ _log_progress_summary(
164
+ action, layer_progress, layer_status, layer_details, layer_bytes_at_last_log, time.time() - last_log_time
165
+ )
153
166
  if action == 'Pushing':
154
167
  logger.info('Pushing final image manifest...')
155
168
  logger.info(f'{action} Docker image completed')
156
169
 
157
170
 
158
- def _log_progress_summary(action: str, layer_progress: dict, layer_status: dict) -> None:
171
+ def _log_progress_summary(
172
+ action: str,
173
+ layer_progress: Dict[str, float],
174
+ layer_status: Dict[str, str],
175
+ layer_details: Dict[str, Dict[str, int]],
176
+ layer_bytes_at_last_log: Dict[str, int],
177
+ time_delta: float,
178
+ ) -> None:
159
179
  if not layer_progress and not layer_status:
160
180
  return
161
181
 
@@ -174,7 +194,36 @@ def _log_progress_summary(action: str, layer_progress: dict, layer_status: dict)
174
194
  if status in ['preparing', 'waiting', 'pushing', 'uploading'] and layer_progress.get(layer_id, 0) < 100
175
195
  ]
176
196
 
177
- if active_layers:
197
+ if active_layers and layer_details:
198
+ total_bytes_transferred = 0
199
+ layer_info_parts = []
200
+
201
+ for layer_id in active_layers[:5]:
202
+ if layer_id in layer_details:
203
+ details = layer_details[layer_id]
204
+ current = details['current']
205
+ total = details['total']
206
+ percentage = layer_progress.get(layer_id, 0)
207
+
208
+ bytes_since_last = current - layer_bytes_at_last_log.get(layer_id, 0)
209
+ total_bytes_transferred += bytes_since_last
210
+
211
+ current_mb = current / (1024 * 1024)
212
+ total_mb = total / (1024 * 1024)
213
+ layer_info_parts.append(f'{layer_id}: {current_mb:.1f}/{total_mb:.1f} MB ({percentage:.1f}%)')
214
+
215
+ speed_info = ''
216
+ if time_delta > 0 and total_bytes_transferred > 0:
217
+ speed_mbps = (total_bytes_transferred / (1024 * 1024)) / time_delta
218
+ speed_info = f' @ {speed_mbps:.2f} MB/s'
219
+
220
+ more_layers_info = ''
221
+ if len(active_layers) > 5:
222
+ more_layers_info = f' (+ {len(active_layers) - 5} more)'
223
+
224
+ if layer_info_parts:
225
+ logger.info(f'Active layers: {", ".join(layer_info_parts)}{speed_info}{more_layers_info}')
226
+ elif active_layers:
178
227
  logger.info(f'Active layers: {", ".join(active_layers[:5])}{"..." if len(active_layers) > 5 else ""}')
179
228
 
180
229
 
@@ -498,11 +498,11 @@ class Result:
498
498
  stdout_and_stderr_package = base64.b64decode(stdout_and_stderr_package_b64)
499
499
  stdout_and_stderr = StdoutAndStderr(stdout_and_stderr_package).deserialize()
500
500
 
501
- sys.stdout.write(stdout_and_stderr.decode())
501
+ sys.stdout.buffer.write(stdout_and_stderr)
502
502
  if not IS_RUNNING_IN_NOTEBOOK: # for some reason flushing in jupyter notebooks breaks \r handling
503
- sys.stdout.flush()
503
+ sys.stdout.buffer.flush()
504
504
  # flush after having processed all packages
505
- sys.stdout.flush()
505
+ sys.stdout.buffer.flush()
506
506
 
507
507
  def show(self) -> None:
508
508
  self._refetch_job_dict()
@@ -522,11 +522,11 @@ class Result:
522
522
  logger.info(f'--- The result {self.id} has already completed (no streaming will take place) ---')
523
523
  logger.info('--- The stdout log is printed below: ---')
524
524
  sys.stdout.flush()
525
- print(self.get_stdout().decode(), file=sys.stdout)
526
- sys.stdout.flush()
525
+ sys.stdout.buffer.write(self.get_stdout())
526
+ sys.stdout.buffer.flush()
527
527
  logger.info('--- The stderr log is printed below: ---')
528
- print(self.get_stderr().decode(), file=sys.stderr)
529
- sys.stderr.flush()
528
+ sys.stderr.buffer.write(self.get_stderr())
529
+ sys.stderr.buffer.flush()
530
530
  logger.info(f'--- The job {self.id} has already completed. Its output was printed above. ---')
531
531
  return
532
532
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "pybiolib"
3
- version = "1.2.1304"
3
+ version = "1.2.1310"
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