bluer-objects 6.166.1__tar.gz → 6.170.1__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 bluer-objects might be problematic. Click here for more details.

Files changed (171) hide show
  1. {bluer_objects-6.166.1/bluer_objects.egg-info → bluer_objects-6.170.1}/PKG-INFO +2 -2
  2. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/README.md +1 -1
  3. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/__init__.py +1 -1
  4. bluer_objects-6.170.1/bluer_objects/mlflow/lock/__init__.py +1 -0
  5. bluer_objects-6.170.1/bluer_objects/mlflow/lock/__main__.py +58 -0
  6. bluer_objects-6.170.1/bluer_objects/mlflow/lock/functions.py +121 -0
  7. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/storage/s3.py +98 -0
  8. {bluer_objects-6.166.1 → bluer_objects-6.170.1/bluer_objects.egg-info}/PKG-INFO +2 -2
  9. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects.egg-info/SOURCES.txt +3 -0
  10. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/setup.py +1 -0
  11. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/LICENSE +0 -0
  12. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/MANIFEST.in +0 -0
  13. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/abcli.sh +0 -0
  14. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/actions.sh +0 -0
  15. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/aka.sh +0 -0
  16. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/alias.sh +0 -0
  17. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/bluer_objects.sh +0 -0
  18. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/clone.sh +0 -0
  19. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/create_test_asset.sh +0 -0
  20. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/download.sh +0 -0
  21. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/file.sh +0 -0
  22. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/gif.sh +0 -0
  23. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/host.sh +0 -0
  24. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/ls.sh +0 -0
  25. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/metadata/get.sh +0 -0
  26. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/metadata/post.sh +0 -0
  27. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/metadata.sh +0 -0
  28. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/mlflow/browse.sh +0 -0
  29. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/mlflow/cache.sh +0 -0
  30. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/mlflow/deploy.sh +0 -0
  31. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/mlflow/list_registered_models.sh +0 -0
  32. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/mlflow/lock/lock.sh +0 -0
  33. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/mlflow/lock/unlock.sh +0 -0
  34. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/mlflow/lock.sh +0 -0
  35. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/mlflow/log_artifacts.sh +0 -0
  36. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/mlflow/log_run.sh +0 -0
  37. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/mlflow/run.sh +0 -0
  38. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/mlflow/tags/clone.sh +0 -0
  39. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/mlflow/tags/get.sh +0 -0
  40. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/mlflow/tags/search.sh +0 -0
  41. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/mlflow/tags/set.sh +0 -0
  42. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/mlflow/tags.sh +0 -0
  43. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/mlflow/test.sh +0 -0
  44. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/mlflow/transition.sh +0 -0
  45. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/mlflow.sh +0 -0
  46. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/object.sh +0 -0
  47. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/select.sh +0 -0
  48. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/storage/clear.sh +0 -0
  49. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/storage/download_file.sh +0 -0
  50. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/storage/exists.sh +0 -0
  51. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/storage/list.sh +0 -0
  52. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/storage/rm.sh +0 -0
  53. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/storage/status.sh +0 -0
  54. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/storage.sh +0 -0
  55. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/tests/README.sh +0 -0
  56. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/tests/clone.sh +0 -0
  57. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/tests/create_test_asset.sh +0 -0
  58. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/tests/gif.sh +0 -0
  59. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/tests/help.sh +0 -0
  60. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/tests/host.sh +0 -0
  61. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/tests/ls.sh +0 -0
  62. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/tests/metadata.sh +0 -0
  63. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/tests/mlflow_cache.sh +0 -0
  64. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/tests/mlflow_lock.sh +0 -0
  65. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/tests/mlflow_logging.sh +0 -0
  66. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/tests/mlflow_tags.sh +0 -0
  67. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/tests/mlflow_test.sh +0 -0
  68. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/tests/storage.sh +0 -0
  69. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/tests/version.sh +0 -0
  70. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/.abcli/upload.sh +0 -0
  71. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/README/__init__.py +0 -0
  72. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/README/functions.py +0 -0
  73. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/README/items.py +0 -0
  74. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/__main__.py +0 -0
  75. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/config.env +0 -0
  76. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/env.py +0 -0
  77. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/file/__init__.py +0 -0
  78. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/file/__main__.py +0 -0
  79. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/file/classes.py +0 -0
  80. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/file/functions.py +0 -0
  81. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/file/load.py +0 -0
  82. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/file/save.py +0 -0
  83. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/graphics/__init__.py +0 -0
  84. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/graphics/__main__.py +0 -0
  85. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/graphics/frame.py +0 -0
  86. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/graphics/gif.py +0 -0
  87. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/graphics/screen.py +0 -0
  88. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/graphics/signature.py +0 -0
  89. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/graphics/text.py +0 -0
  90. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/help/__init__.py +0 -0
  91. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/help/__main__.py +0 -0
  92. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/help/clone.py +0 -0
  93. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/help/create_test_asset.py +0 -0
  94. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/help/download.py +0 -0
  95. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/help/functions.py +0 -0
  96. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/help/gif.py +0 -0
  97. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/help/host.py +0 -0
  98. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/help/ls.py +0 -0
  99. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/help/metadata.py +0 -0
  100. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/help/mlflow/__init__.py +0 -0
  101. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/help/mlflow/cache.py +0 -0
  102. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/help/mlflow/lock.py +0 -0
  103. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/help/mlflow/tags.py +0 -0
  104. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/help/upload.py +0 -0
  105. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/host/__init__.py +0 -0
  106. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/host/__main__.py +0 -0
  107. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/host/functions.py +0 -0
  108. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/logger/__init__.py +0 -0
  109. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/logger/matrix.py +0 -0
  110. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/markdown.py +0 -0
  111. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/metadata/__init__.py +0 -0
  112. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/metadata/__main__.py +0 -0
  113. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/metadata/enums.py +0 -0
  114. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/metadata/get.py +0 -0
  115. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/metadata/post.py +0 -0
  116. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/mlflow/__init__.py +0 -0
  117. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/mlflow/__main__.py +0 -0
  118. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/mlflow/cache.py +0 -0
  119. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/mlflow/logging.py +0 -0
  120. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/mlflow/models.py +0 -0
  121. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/mlflow/objects.py +0 -0
  122. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/mlflow/runs.py +0 -0
  123. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/mlflow/tags.py +0 -0
  124. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/mlflow/testing.py +0 -0
  125. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/objects.py +0 -0
  126. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/path.py +0 -0
  127. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/sample.env +0 -0
  128. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/storage/WebDAV.py +0 -0
  129. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/storage/WebDAVrequest.py +0 -0
  130. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/storage/WebDAVzip.py +0 -0
  131. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/storage/__init__.py +0 -0
  132. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/storage/__main__.py +0 -0
  133. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/storage/base.py +0 -0
  134. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/testing/__init__.py +0 -0
  135. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/testing/__main__.py +0 -0
  136. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/testing/functions.py +0 -0
  137. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/tests/__init__.py +0 -0
  138. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/tests/test_README.py +0 -0
  139. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/tests/test_env.py +0 -0
  140. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/tests/test_file_download.py +0 -0
  141. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/tests/test_file_load_save.py +0 -0
  142. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/tests/test_file_load_save_text.py +0 -0
  143. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/tests/test_fullname.py +0 -0
  144. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/tests/test_graphics.py +0 -0
  145. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/tests/test_graphics_frame.py +0 -0
  146. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/tests/test_graphics_gif.py +0 -0
  147. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/tests/test_graphics_screen.py +0 -0
  148. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/tests/test_graphics_signature.py +0 -0
  149. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/tests/test_graphics_text.py +0 -0
  150. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/tests/test_logger.py +0 -0
  151. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/tests/test_logger_matrix.py +0 -0
  152. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/tests/test_markdown.py +0 -0
  153. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/tests/test_metadata.py +0 -0
  154. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/tests/test_mlflow.py +0 -0
  155. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/tests/test_mlflow_lock.py +0 -0
  156. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/tests/test_objects.py +0 -0
  157. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/tests/test_path.py +0 -0
  158. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/tests/test_storage.py +0 -0
  159. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/tests/test_storage_base.py +0 -0
  160. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/tests/test_storage_s3.py +0 -0
  161. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/tests/test_storage_webdav_request.py +0 -0
  162. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/tests/test_storage_webdav_zip.py +0 -0
  163. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/tests/test_testing.py +0 -0
  164. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/tests/test_version.py +0 -0
  165. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects/urls.py +0 -0
  166. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects.egg-info/dependency_links.txt +0 -0
  167. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects.egg-info/requires.txt +0 -0
  168. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/bluer_objects.egg-info/top_level.txt +0 -0
  169. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/pyproject.toml +0 -0
  170. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/requirements.txt +0 -0
  171. {bluer_objects-6.166.1 → bluer_objects-6.170.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bluer_objects
3
- Version: 6.166.1
3
+ Version: 6.170.1
4
4
  Summary: 🌀 Object management in Bash.
5
5
  Home-page: https://github.com/kamangir/bluer-objects
6
6
  Author: Arash Abadpour (Kamangir)
@@ -64,6 +64,6 @@ pip install bluer-objects
64
64
 
65
65
  [![pylint](https://github.com/kamangir/bluer-objects/actions/workflows/pylint.yml/badge.svg)](https://github.com/kamangir/bluer-objects/actions/workflows/pylint.yml) [![pytest](https://github.com/kamangir/bluer-objects/actions/workflows/pytest.yml/badge.svg)](https://github.com/kamangir/bluer-objects/actions/workflows/pytest.yml) [![bashtest](https://github.com/kamangir/bluer-objects/actions/workflows/bashtest.yml/badge.svg)](https://github.com/kamangir/bluer-objects/actions/workflows/bashtest.yml) [![PyPI version](https://img.shields.io/pypi/v/bluer-objects.svg)](https://pypi.org/project/bluer-objects/) [![PyPI - Downloads](https://img.shields.io/pypi/dd/bluer-objects)](https://pypistats.org/packages/bluer-objects)
66
66
 
67
- built by 🌀 [`bluer README`](https://github.com/kamangir/bluer-objects/tree/main/bluer_objects/README), based on 🌀 [`bluer_objects-6.166.1`](https://github.com/kamangir/bluer-objects).
67
+ built by 🌀 [`bluer README`](https://github.com/kamangir/bluer-objects/tree/main/bluer_objects/README), based on 🌀 [`bluer_objects-6.170.1`](https://github.com/kamangir/bluer-objects).
68
68
 
69
69
  built by 🌀 [`blueness-3.118.1`](https://github.com/kamangir/blueness).
@@ -30,4 +30,4 @@ pip install bluer-objects
30
30
 
31
31
  [![pylint](https://github.com/kamangir/bluer-objects/actions/workflows/pylint.yml/badge.svg)](https://github.com/kamangir/bluer-objects/actions/workflows/pylint.yml) [![pytest](https://github.com/kamangir/bluer-objects/actions/workflows/pytest.yml/badge.svg)](https://github.com/kamangir/bluer-objects/actions/workflows/pytest.yml) [![bashtest](https://github.com/kamangir/bluer-objects/actions/workflows/bashtest.yml/badge.svg)](https://github.com/kamangir/bluer-objects/actions/workflows/bashtest.yml) [![PyPI version](https://img.shields.io/pypi/v/bluer-objects.svg)](https://pypi.org/project/bluer-objects/) [![PyPI - Downloads](https://img.shields.io/pypi/dd/bluer-objects)](https://pypistats.org/packages/bluer-objects)
32
32
 
33
- built by 🌀 [`bluer README`](https://github.com/kamangir/bluer-objects/tree/main/bluer_objects/README), based on 🌀 [`bluer_objects-6.166.1`](https://github.com/kamangir/bluer-objects).
33
+ built by 🌀 [`bluer README`](https://github.com/kamangir/bluer-objects/tree/main/bluer_objects/README), based on 🌀 [`bluer_objects-6.170.1`](https://github.com/kamangir/bluer-objects).
@@ -4,7 +4,7 @@ ICON = "🌀"
4
4
 
5
5
  DESCRIPTION = f"{ICON} Object management in Bash."
6
6
 
7
- VERSION = "6.166.1"
7
+ VERSION = "6.170.1"
8
8
 
9
9
  REPO_NAME = "bluer-objects"
10
10
 
@@ -0,0 +1,58 @@
1
+ import argparse
2
+
3
+ from blueness import module
4
+ from blueness.argparse.generic import sys_exit
5
+
6
+ from bluer_objects import NAME
7
+ from bluer_objects.mlflow.lock.functions import lock, unlock
8
+ from bluer_objects.logger import logger
9
+
10
+ NAME = module.name(__file__, NAME)
11
+
12
+ parser = argparse.ArgumentParser(NAME)
13
+ parser.add_argument(
14
+ "task",
15
+ type=str,
16
+ help="lock | unlock",
17
+ )
18
+ parser.add_argument(
19
+ "--object_name",
20
+ type=str,
21
+ )
22
+ parser.add_argument(
23
+ "--lock",
24
+ type=str,
25
+ default="lock",
26
+ )
27
+ parser.add_argument(
28
+ "--timeout",
29
+ type=int,
30
+ default=-1,
31
+ help="in seconds",
32
+ )
33
+ parser.add_argument(
34
+ "--verbose",
35
+ type=int,
36
+ default=1,
37
+ help="0 | 1",
38
+ )
39
+ args = parser.parse_args()
40
+
41
+ success = False
42
+ if args.task == "lock":
43
+ success = lock(
44
+ object_name=args.object_name,
45
+ lock_name=args.lock,
46
+ timeout=args.timeout,
47
+ verbose=args.verbose == 1,
48
+ )
49
+ elif args.task == "unlock":
50
+ success = unlock(
51
+ object_name=args.object_name,
52
+ lock_name=args.lock,
53
+ verbose=args.verbose == 1,
54
+ )
55
+ else:
56
+ success = None
57
+
58
+ sys_exit(logger, NAME, args.task, success)
@@ -0,0 +1,121 @@
1
+ import time
2
+
3
+ from blueness import module
4
+ from bluer_options import string
5
+
6
+ from bluer_objects import NAME, env
7
+ from bluer_objects.mlflow.tags import get_tags, set_tags
8
+ from bluer_objects.logger import logger
9
+
10
+
11
+ NAME = module.name(__file__, NAME)
12
+
13
+
14
+ def lock(
15
+ object_name: str,
16
+ lock_name: str = "lock",
17
+ timeout: int = -1,
18
+ verbose: bool = True,
19
+ ) -> bool:
20
+ logger.info(
21
+ "{}.lock: {}.{}{}".format(
22
+ NAME,
23
+ object_name,
24
+ lock_name,
25
+ "" if timeout == -1 else " @ {}".format(string.pretty_duration(timeout)),
26
+ )
27
+ )
28
+
29
+ start_time = time.time()
30
+ while True:
31
+ if timeout > 0 and time.time() - start_time > timeout:
32
+ if verbose:
33
+ logger.warning(
34
+ "{}.lock: {}.{} timeout.".format(
35
+ NAME,
36
+ object_name,
37
+ lock_name,
38
+ )
39
+ )
40
+ return False
41
+
42
+ success, list_of_tags = get_tags(object_name=object_name)
43
+ if not success:
44
+ return False
45
+
46
+ lock_value = list_of_tags.get(lock_name, "")
47
+ if lock_value:
48
+ if verbose:
49
+ logger.warning(
50
+ "{}.lock: {}.{} is locked by {}.".format(
51
+ NAME,
52
+ object_name,
53
+ lock_name,
54
+ lock_value,
55
+ )
56
+ )
57
+ time.sleep(env.MLFLOW_LOCK_WAIT_FOR_CLEARANCE)
58
+ continue
59
+
60
+ lock_value = string.random()
61
+ if not set_tags(
62
+ object_name=object_name,
63
+ tags={lock_name: lock_value},
64
+ log=verbose,
65
+ icon="🔒",
66
+ ):
67
+ return False
68
+
69
+ time.sleep(env.MLFLOW_LOCK_WAIT_FOR_EXCLUSIVITY)
70
+
71
+ success, list_of_tags = get_tags(object_name=object_name)
72
+ if not success:
73
+ return False
74
+
75
+ lock_value_read = list_of_tags.get(lock_name, "")
76
+ if lock_value_read != lock_value:
77
+ if verbose:
78
+ logger.warning(
79
+ "{}.lock: {}.{} is relocked by {} != {}.".format(
80
+ NAME,
81
+ object_name,
82
+ lock_name,
83
+ lock_value_read,
84
+ lock_value,
85
+ )
86
+ )
87
+ time.sleep(env.MLFLOW_LOCK_WAIT_FOR_CLEARANCE)
88
+ continue
89
+
90
+ break
91
+
92
+ logger.info(
93
+ "{}.lock: {}.{} is locked by {}.".format(
94
+ NAME,
95
+ object_name,
96
+ lock_name,
97
+ lock_value,
98
+ )
99
+ )
100
+ return True
101
+
102
+
103
+ def unlock(
104
+ object_name: str,
105
+ lock_name: str = "lock",
106
+ verbose: bool = True,
107
+ ) -> bool:
108
+ logger.info(
109
+ "{}.unlock: {}.{}".format(
110
+ NAME,
111
+ object_name,
112
+ lock_name,
113
+ )
114
+ )
115
+
116
+ return set_tags(
117
+ object_name=object_name,
118
+ tags={lock_name: ""},
119
+ log=verbose,
120
+ icon="🔒",
121
+ )
@@ -16,6 +16,104 @@ from bluer_objects.logger import logger
16
16
  class S3Interface(StorageInterface):
17
17
  name = "s3"
18
18
 
19
+ def clear(
20
+ self,
21
+ do_dryrun: bool = True,
22
+ log: bool = True,
23
+ ) -> bool:
24
+ logger.info(
25
+ "{}.clear({})".format(
26
+ self.__class__.__name__,
27
+ "dryrun" if do_dryrun else "",
28
+ )
29
+ )
30
+
31
+ try:
32
+ s3 = boto3.client(
33
+ "s3",
34
+ endpoint_url=env.S3_STORAGE_ENDPOINT_URL,
35
+ aws_access_key_id=env.S3_STORAGE_AWS_ACCESS_KEY_ID,
36
+ aws_secret_access_key=env.S3_STORAGE_AWS_SECRET_ACCESS_KEY,
37
+ )
38
+
39
+ paginator = s3.get_paginator("list_objects_v2")
40
+ pages = paginator.paginate(
41
+ Bucket=env.S3_STORAGE_BUCKET,
42
+ Prefix="test",
43
+ )
44
+ except Exception as e:
45
+ logger.error(e)
46
+ return False
47
+
48
+ list_of_objects = sorted(
49
+ list(
50
+ set(
51
+ reduce(
52
+ lambda x, y: x + y,
53
+ [
54
+ [
55
+ obj["Key"].split("/", 1)[0]
56
+ for obj in page.get("Contents", [])
57
+ ]
58
+ for page in pages
59
+ ],
60
+ [],
61
+ )
62
+ )
63
+ )
64
+ )
65
+
66
+ logger.info(f"{len(list_of_objects)} object(s) to delete.")
67
+
68
+ for object_name in tqdm(list_of_objects):
69
+ if not self.delete(
70
+ object_name=object_name,
71
+ do_dryrun=do_dryrun,
72
+ ):
73
+ return False
74
+
75
+ return True
76
+
77
+ def delete(
78
+ self,
79
+ object_name: str,
80
+ do_dryrun: bool = True,
81
+ log: bool = True,
82
+ ) -> bool:
83
+ if log:
84
+ logger.info(
85
+ "{}.delete({}){}".format(
86
+ self.__class__.__name__,
87
+ object_name,
88
+ " dryrun" if do_dryrun else "",
89
+ )
90
+ )
91
+ if do_dryrun:
92
+ return True
93
+
94
+ try:
95
+ s3 = boto3.resource(
96
+ "s3",
97
+ endpoint_url=env.S3_STORAGE_ENDPOINT_URL,
98
+ aws_access_key_id=env.S3_STORAGE_AWS_ACCESS_KEY_ID,
99
+ aws_secret_access_key=env.S3_STORAGE_AWS_SECRET_ACCESS_KEY,
100
+ )
101
+ bucket = s3.Bucket(env.S3_STORAGE_BUCKET)
102
+
103
+ objects_to_delete = bucket.objects.filter(Prefix=f"{object_name}/")
104
+ delete_requests = [{"Key": obj.key} for obj in objects_to_delete]
105
+
106
+ if not delete_requests:
107
+ logger.warning(f"no files found under {object_name}.")
108
+ return True
109
+
110
+ bucket.delete_objects(Delete={"Objects": delete_requests})
111
+ except Exception as e:
112
+ logger.error(e)
113
+ return False
114
+
115
+ return True
116
+
19
117
  def download(
20
118
  self,
21
119
  object_name: str,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bluer_objects
3
- Version: 6.166.1
3
+ Version: 6.170.1
4
4
  Summary: 🌀 Object management in Bash.
5
5
  Home-page: https://github.com/kamangir/bluer-objects
6
6
  Author: Arash Abadpour (Kamangir)
@@ -64,6 +64,6 @@ pip install bluer-objects
64
64
 
65
65
  [![pylint](https://github.com/kamangir/bluer-objects/actions/workflows/pylint.yml/badge.svg)](https://github.com/kamangir/bluer-objects/actions/workflows/pylint.yml) [![pytest](https://github.com/kamangir/bluer-objects/actions/workflows/pytest.yml/badge.svg)](https://github.com/kamangir/bluer-objects/actions/workflows/pytest.yml) [![bashtest](https://github.com/kamangir/bluer-objects/actions/workflows/bashtest.yml/badge.svg)](https://github.com/kamangir/bluer-objects/actions/workflows/bashtest.yml) [![PyPI version](https://img.shields.io/pypi/v/bluer-objects.svg)](https://pypi.org/project/bluer-objects/) [![PyPI - Downloads](https://img.shields.io/pypi/dd/bluer-objects)](https://pypistats.org/packages/bluer-objects)
66
66
 
67
- built by 🌀 [`bluer README`](https://github.com/kamangir/bluer-objects/tree/main/bluer_objects/README), based on 🌀 [`bluer_objects-6.166.1`](https://github.com/kamangir/bluer-objects).
67
+ built by 🌀 [`bluer README`](https://github.com/kamangir/bluer-objects/tree/main/bluer_objects/README), based on 🌀 [`bluer_objects-6.170.1`](https://github.com/kamangir/bluer-objects).
68
68
 
69
69
  built by 🌀 [`blueness-3.118.1`](https://github.com/kamangir/blueness).
@@ -126,6 +126,9 @@ bluer_objects/mlflow/objects.py
126
126
  bluer_objects/mlflow/runs.py
127
127
  bluer_objects/mlflow/tags.py
128
128
  bluer_objects/mlflow/testing.py
129
+ bluer_objects/mlflow/lock/__init__.py
130
+ bluer_objects/mlflow/lock/__main__.py
131
+ bluer_objects/mlflow/lock/functions.py
129
132
  bluer_objects/storage/WebDAV.py
130
133
  bluer_objects/storage/WebDAVrequest.py
131
134
  bluer_objects/storage/WebDAVzip.py
@@ -17,6 +17,7 @@ setup(
17
17
  f"{NAME}.logger",
18
18
  f"{NAME}.metadata",
19
19
  f"{NAME}.mlflow",
20
+ f"{NAME}.mlflow.lock",
20
21
  f"{NAME}.README",
21
22
  f"{NAME}.storage",
22
23
  f"{NAME}.testing",
File without changes