bluer-objects 6.151.1__tar.gz → 6.164.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 (170) hide show
  1. {bluer_objects-6.151.1/bluer_objects.egg-info → bluer_objects-6.164.1}/PKG-INFO +3 -3
  2. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/README.md +2 -2
  3. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/alias.sh +2 -0
  4. bluer_objects-6.164.1/bluer_objects/.abcli/mlflow/lock/lock.sh +11 -0
  5. bluer_objects-6.164.1/bluer_objects/.abcli/mlflow/lock/unlock.sh +12 -0
  6. bluer_objects-6.164.1/bluer_objects/.abcli/mlflow/lock.sh +15 -0
  7. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/tests/help.sh +4 -0
  8. bluer_objects-6.164.1/bluer_objects/.abcli/tests/mlflow_lock.sh +30 -0
  9. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/README/__init__.py +2 -0
  10. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/__init__.py +1 -1
  11. bluer_objects-6.164.1/bluer_objects/config.env +8 -0
  12. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/env.py +4 -0
  13. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/help/mlflow/__init__.py +2 -0
  14. bluer_objects-6.164.1/bluer_objects/help/mlflow/lock.py +52 -0
  15. bluer_objects-6.164.1/bluer_objects/mlflow/logging.py +87 -0
  16. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/tests/test_env.py +6 -0
  17. bluer_objects-6.164.1/bluer_objects/tests/test_mlflow_lock.py +26 -0
  18. {bluer_objects-6.151.1 → bluer_objects-6.164.1/bluer_objects.egg-info}/PKG-INFO +3 -3
  19. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects.egg-info/SOURCES.txt +6 -0
  20. bluer_objects-6.151.1/bluer_objects/config.env +0 -5
  21. bluer_objects-6.151.1/bluer_objects/mlflow/logging.py +0 -81
  22. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/LICENSE +0 -0
  23. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/MANIFEST.in +0 -0
  24. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/abcli.sh +0 -0
  25. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/actions.sh +0 -0
  26. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/aka.sh +0 -0
  27. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/bluer_objects.sh +0 -0
  28. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/clone.sh +0 -0
  29. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/create_test_asset.sh +0 -0
  30. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/download.sh +0 -0
  31. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/file.sh +0 -0
  32. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/gif.sh +0 -0
  33. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/host.sh +0 -0
  34. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/ls.sh +0 -0
  35. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/metadata/get.sh +0 -0
  36. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/metadata/post.sh +0 -0
  37. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/metadata.sh +0 -0
  38. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/mlflow/browse.sh +0 -0
  39. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/mlflow/cache.sh +0 -0
  40. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/mlflow/deploy.sh +0 -0
  41. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/mlflow/list_registered_models.sh +0 -0
  42. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/mlflow/log_artifacts.sh +0 -0
  43. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/mlflow/log_run.sh +0 -0
  44. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/mlflow/run.sh +0 -0
  45. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/mlflow/tags/clone.sh +0 -0
  46. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/mlflow/tags/get.sh +0 -0
  47. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/mlflow/tags/search.sh +0 -0
  48. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/mlflow/tags/set.sh +0 -0
  49. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/mlflow/tags.sh +0 -0
  50. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/mlflow/test.sh +0 -0
  51. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/mlflow/transition.sh +0 -0
  52. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/mlflow.sh +0 -0
  53. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/object.sh +0 -0
  54. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/select.sh +0 -0
  55. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/storage/clear.sh +0 -0
  56. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/storage/download_file.sh +0 -0
  57. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/storage/exists.sh +0 -0
  58. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/storage/list.sh +0 -0
  59. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/storage/rm.sh +0 -0
  60. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/storage/status.sh +0 -0
  61. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/storage.sh +0 -0
  62. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/tests/README.sh +0 -0
  63. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/tests/clone.sh +0 -0
  64. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/tests/create_test_asset.sh +0 -0
  65. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/tests/gif.sh +0 -0
  66. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/tests/host.sh +0 -0
  67. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/tests/ls.sh +0 -0
  68. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/tests/metadata.sh +0 -0
  69. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/tests/mlflow_cache.sh +0 -0
  70. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/tests/mlflow_logging.sh +0 -0
  71. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/tests/mlflow_tags.sh +0 -0
  72. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/tests/mlflow_test.sh +0 -0
  73. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/tests/storage.sh +0 -0
  74. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/tests/version.sh +0 -0
  75. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/.abcli/upload.sh +0 -0
  76. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/README/functions.py +0 -0
  77. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/README/items.py +0 -0
  78. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/__main__.py +0 -0
  79. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/file/__init__.py +0 -0
  80. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/file/__main__.py +0 -0
  81. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/file/classes.py +0 -0
  82. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/file/functions.py +0 -0
  83. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/file/load.py +0 -0
  84. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/file/save.py +0 -0
  85. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/graphics/__init__.py +0 -0
  86. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/graphics/__main__.py +0 -0
  87. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/graphics/frame.py +0 -0
  88. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/graphics/gif.py +0 -0
  89. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/graphics/screen.py +0 -0
  90. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/graphics/signature.py +0 -0
  91. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/graphics/text.py +0 -0
  92. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/help/__init__.py +0 -0
  93. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/help/__main__.py +0 -0
  94. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/help/clone.py +0 -0
  95. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/help/create_test_asset.py +0 -0
  96. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/help/download.py +0 -0
  97. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/help/functions.py +0 -0
  98. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/help/gif.py +0 -0
  99. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/help/host.py +0 -0
  100. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/help/ls.py +0 -0
  101. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/help/metadata.py +0 -0
  102. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/help/mlflow/cache.py +0 -0
  103. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/help/mlflow/tags.py +0 -0
  104. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/help/upload.py +0 -0
  105. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/host/__init__.py +0 -0
  106. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/host/__main__.py +0 -0
  107. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/host/functions.py +0 -0
  108. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/logger/__init__.py +0 -0
  109. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/logger/matrix.py +0 -0
  110. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/markdown.py +0 -0
  111. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/metadata/__init__.py +0 -0
  112. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/metadata/__main__.py +0 -0
  113. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/metadata/enums.py +0 -0
  114. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/metadata/get.py +0 -0
  115. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/metadata/post.py +0 -0
  116. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/mlflow/__init__.py +0 -0
  117. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/mlflow/__main__.py +0 -0
  118. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/mlflow/cache.py +0 -0
  119. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/mlflow/models.py +0 -0
  120. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/mlflow/objects.py +0 -0
  121. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/mlflow/runs.py +0 -0
  122. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/mlflow/tags.py +0 -0
  123. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/mlflow/testing.py +0 -0
  124. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/objects.py +0 -0
  125. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/path.py +0 -0
  126. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/sample.env +0 -0
  127. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/storage/WebDAV.py +0 -0
  128. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/storage/WebDAVrequest.py +0 -0
  129. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/storage/WebDAVzip.py +0 -0
  130. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/storage/__init__.py +0 -0
  131. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/storage/__main__.py +0 -0
  132. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/storage/base.py +0 -0
  133. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/storage/s3.py +0 -0
  134. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/testing/__init__.py +0 -0
  135. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/testing/__main__.py +0 -0
  136. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/testing/functions.py +0 -0
  137. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/tests/__init__.py +0 -0
  138. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/tests/test_README.py +0 -0
  139. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/tests/test_file_download.py +0 -0
  140. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/tests/test_file_load_save.py +0 -0
  141. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/tests/test_file_load_save_text.py +0 -0
  142. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/tests/test_fullname.py +0 -0
  143. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/tests/test_graphics.py +0 -0
  144. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/tests/test_graphics_frame.py +0 -0
  145. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/tests/test_graphics_gif.py +0 -0
  146. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/tests/test_graphics_screen.py +0 -0
  147. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/tests/test_graphics_signature.py +0 -0
  148. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/tests/test_graphics_text.py +0 -0
  149. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/tests/test_logger.py +0 -0
  150. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/tests/test_logger_matrix.py +0 -0
  151. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/tests/test_markdown.py +0 -0
  152. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/tests/test_metadata.py +0 -0
  153. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/tests/test_mlflow.py +0 -0
  154. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/tests/test_objects.py +0 -0
  155. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/tests/test_path.py +0 -0
  156. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/tests/test_storage.py +0 -0
  157. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/tests/test_storage_base.py +0 -0
  158. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/tests/test_storage_s3.py +0 -0
  159. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/tests/test_storage_webdav_request.py +0 -0
  160. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/tests/test_storage_webdav_zip.py +0 -0
  161. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/tests/test_testing.py +0 -0
  162. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/tests/test_version.py +0 -0
  163. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects/urls.py +0 -0
  164. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects.egg-info/dependency_links.txt +0 -0
  165. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects.egg-info/requires.txt +0 -0
  166. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/bluer_objects.egg-info/top_level.txt +0 -0
  167. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/pyproject.toml +0 -0
  168. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/requirements.txt +0 -0
  169. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/setup.cfg +0 -0
  170. {bluer_objects-6.151.1 → bluer_objects-6.164.1}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bluer_objects
3
- Version: 6.151.1
3
+ Version: 6.164.1
4
4
  Summary: 🌀 Object management in Bash.
5
5
  Home-page: https://github.com/kamangir/bluer-objects
6
6
  Author: Arash Abadpour (Kamangir)
@@ -36,7 +36,7 @@ Dynamic: summary
36
36
 
37
37
  🌀 `bluer-objects` are the inputs and outputs of [AI algo](https://github.com/kamangir/giza). They are maintained in cloud storage (supports [WebDav](https://pypi.org/project/webdavclient3/)) and their metadata is tracked by [MLflow](https://mlflow.org/). Examples are the Sentinel-2 [datacube](https://github.com/kamangir/blue-geo/tree/main/blue_geo/datacube) `datacube-EarthSearch-sentinel_2_l1c-S2A_10UDC_20240731_0_L1C` and 🌐 [`@geo watch` outputs](https://github.com/kamangir/blue-geo/tree/main/blue_geo/watch).
38
38
 
39
- Also home to 🌀 [bluer README](https://github.com/kamangir/bluer-objects/blob/main/bluer_objects/README/).
39
+ Also home to 🌀 [bluer README](https://github.com/kamangir/bluer-objects/blob/main/bluer_objects/README/), and the 🔒 [`Lock`](https://github.com/kamangir/bluer-objects/blob/main/bluer_objects/mlflow/lock/).
40
40
 
41
41
  # installation
42
42
 
@@ -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.151.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.164.1`](https://github.com/kamangir/bluer-objects).
68
68
 
69
69
  built by 🌀 [`blueness-3.118.1`](https://github.com/kamangir/blueness).
@@ -2,7 +2,7 @@
2
2
 
3
3
  🌀 `bluer-objects` are the inputs and outputs of [AI algo](https://github.com/kamangir/giza). They are maintained in cloud storage (supports [WebDav](https://pypi.org/project/webdavclient3/)) and their metadata is tracked by [MLflow](https://mlflow.org/). Examples are the Sentinel-2 [datacube](https://github.com/kamangir/blue-geo/tree/main/blue_geo/datacube) `datacube-EarthSearch-sentinel_2_l1c-S2A_10UDC_20240731_0_L1C` and 🌐 [`@geo watch` outputs](https://github.com/kamangir/blue-geo/tree/main/blue_geo/watch).
4
4
 
5
- Also home to 🌀 [bluer README](./bluer_objects/README/).
5
+ Also home to 🌀 [bluer README](./bluer_objects/README/), and the 🔒 [`Lock`](./bluer_objects/mlflow/lock/).
6
6
 
7
7
  # installation
8
8
 
@@ -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.151.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.164.1`](https://github.com/kamangir/bluer-objects).
@@ -21,6 +21,8 @@ alias @host=bluer_objects_host
21
21
 
22
22
  alias @ls=bluer_objects_ls
23
23
 
24
+ alias @lock=bluer_objects_mlflow_lock
25
+
24
26
  alias @metadata=bluer_objects_metadata
25
27
 
26
28
  alias @mlflow=bluer_objects_mlflow
@@ -0,0 +1,11 @@
1
+ #! /usr/bin/env bash
2
+
3
+ function bluer_objects_mlflow_lock_lock() {
4
+ local object_name=$(bluer_ai_clarify_object $1 .)
5
+
6
+ bluer_ai_eval dryrun=$do_dryrun \
7
+ python3 -m bluer_objects.mlflow.lock \
8
+ lock \
9
+ --object_name $object_name \
10
+ "${@:2}"
11
+ }
@@ -0,0 +1,12 @@
1
+ #! /usr/bin/env bash
2
+
3
+ function bluer_objects_mlflow_lock_unlock() {
4
+ local object_name=$(bluer_ai_clarify_object $1 .)
5
+
6
+ bluer_ai_eval dryrun=$do_dryrun \
7
+ python3 -m bluer_objects.mlflow.lock \
8
+ unlock \
9
+ --object_name $object_name \
10
+ "${@:2}"
11
+
12
+ }
@@ -0,0 +1,15 @@
1
+ #! /usr/bin/env bash
2
+
3
+ function bluer_objects_mlflow_lock() {
4
+ local task=$1
5
+
6
+ local function_name=bluer_objects_mlflow_lock_$task
7
+ if [[ $(type -t $function_name) == "function" ]]; then
8
+ $function_name "${@:2}"
9
+ return
10
+ fi
11
+
12
+ python3 -m bluer_objects.mlflow.lock "$@"
13
+ }
14
+
15
+ bluer_ai_source_caller_suffix_path /lock
@@ -37,6 +37,10 @@ function test_bluer_objects_help() {
37
37
  "@host reboot" \
38
38
  "@host shutdown" \
39
39
  \
40
+ "@lock" \
41
+ "@lock lock" \
42
+ "@lock unlock" \
43
+ \
40
44
  "@metadata" \
41
45
  "@metadata get" \
42
46
  "@metadata post" \
@@ -0,0 +1,30 @@
1
+ #! /usr/bin/env bash
2
+
3
+ function test_bluer_objects_mlflow_lock() {
4
+ local options=$1
5
+
6
+ local object_name="test-object-$(bluer_ai_string_timestamp_short)"
7
+ local lock_name="lock-$(bluer_ai_string_random)"
8
+
9
+ bluer_ai_eval ,$options \
10
+ bluer_objects_mlflow_lock \
11
+ lock \
12
+ $object_name \
13
+ --lock $lock_name \
14
+ --timeout 10
15
+ [[ $? -ne 0 ]] && return 1
16
+
17
+ bluer_ai_eval ,$options \
18
+ bluer_objects_mlflow_lock \
19
+ lock \
20
+ $object_name \
21
+ --lock $lock_name \
22
+ --timeout 10
23
+ [[ $? -eq 0 ]] && return 1
24
+
25
+ bluer_ai_eval ,$options \
26
+ bluer_objects_mlflow_lock \
27
+ unlock \
28
+ $object_name \
29
+ --lock $lock_name
30
+ }
@@ -41,5 +41,7 @@ def build_me() -> bool:
41
41
  "../docs/aliases/metadata.md",
42
42
  "../docs/aliases/mlflow.md",
43
43
  "../docs/aliases/upload.md",
44
+ # modules
45
+ "../mlflow/lock",
44
46
  ]
45
47
  )
@@ -4,7 +4,7 @@ ICON = "🌀"
4
4
 
5
5
  DESCRIPTION = f"{ICON} Object management in Bash."
6
6
 
7
- VERSION = "6.151.1"
7
+ VERSION = "6.164.1"
8
8
 
9
9
  REPO_NAME = "bluer-objects"
10
10
 
@@ -0,0 +1,8 @@
1
+ ABCLI_MLFLOW_EXPERIMENT_PREFIX=experiment/
2
+
3
+ MLFLOW_LOCK_WAIT_FOR_CLEARANCE=3
4
+ MLFLOW_LOCK_WAIT_FOR_EXCLUSIVITY=1
5
+
6
+ S3_STORAGE_BUCKET=kamangir
7
+
8
+ BLUER_OBJECTS_STORAGE_INTERFACE=s3
@@ -52,6 +52,10 @@ if MLFLOW_DEPLOYMENT == "local":
52
52
  else:
53
53
  MLFLOW_TRACKING_URI = MLFLOW_DEPLOYMENT
54
54
  os.environ["MLFLOW_TRACKING_URI"] = MLFLOW_TRACKING_URI
55
+ MLFLOW_LOG_ARTIFACTS = "arvan" not in MLFLOW_DEPLOYMENT
56
+
57
+ MLFLOW_LOCK_WAIT_FOR_CLEARANCE = get_env("MLFLOW_LOCK_WAIT_FOR_CLEARANCE", 3)
58
+ MLFLOW_LOCK_WAIT_FOR_EXCLUSIVITY = get_env("MLFLOW_LOCK_WAIT_FOR_EXCLUSIVITY", 1)
55
59
 
56
60
  WEBDAV_HOSTNAME = get_env("WEBDAV_HOSTNAME")
57
61
  WEBDAV_LOGIN = get_env("WEBDAV_LOGIN")
@@ -3,6 +3,7 @@ from typing import List
3
3
  from bluer_options.terminal import show_usage, xtra
4
4
 
5
5
  from bluer_objects.help.mlflow.cache import help_functions as help_cache
6
+ from bluer_objects.help.mlflow.lock import help_functions as help_lock
6
7
  from bluer_objects.help.mlflow.tags import help_functions as help_tags
7
8
  from bluer_ai import env
8
9
 
@@ -202,6 +203,7 @@ help_functions = {
202
203
  "get_id": help_get_id,
203
204
  "get_run_id": help_get_run_id,
204
205
  "list_registered_models": help_list_registered_models,
206
+ "lock": help_lock,
205
207
  "log_artifacts": help_log_artifacts,
206
208
  "log_run": help_log_run,
207
209
  "rm": help_rm,
@@ -0,0 +1,52 @@
1
+ from typing import List
2
+
3
+ from bluer_options.terminal import show_usage, xtra
4
+
5
+
6
+ def help_lock(
7
+ tokens: List[str],
8
+ mono: bool,
9
+ ) -> str:
10
+ args = [
11
+ "[--lock <lock-name>]",
12
+ "[--timeout <10>]",
13
+ "[--verbose 0]",
14
+ ]
15
+
16
+ return show_usage(
17
+ [
18
+ "@lock",
19
+ "lock",
20
+ "[.|<object-name>]",
21
+ ]
22
+ + args,
23
+ "lock <object-name>.",
24
+ mono=mono,
25
+ )
26
+
27
+
28
+ def help_unlock(
29
+ tokens: List[str],
30
+ mono: bool,
31
+ ) -> str:
32
+ args = [
33
+ "[--lock <lock-name>]",
34
+ "[--verbose 0]",
35
+ ]
36
+
37
+ return show_usage(
38
+ [
39
+ "@lock",
40
+ "unlock",
41
+ "[.|<object-name>]",
42
+ ]
43
+ + args,
44
+ "unlock <object-name>.",
45
+ mono=mono,
46
+ )
47
+
48
+
49
+ help_functions = {
50
+ "lock": help_lock,
51
+ "unlock": help_unlock,
52
+ }
@@ -0,0 +1,87 @@
1
+ from typing import Dict
2
+ import os
3
+ import glob
4
+ import mlflow
5
+
6
+ from blueness import module
7
+ from bluer_options.logger import crash_report
8
+
9
+ from bluer_objects import file, objects, NAME, env
10
+ from bluer_objects.mlflow.runs import start_run, end_run
11
+ from bluer_objects.logger import logger
12
+
13
+ NAME = module.name(__file__, NAME)
14
+
15
+
16
+ def log_artifacts(
17
+ object_name: str,
18
+ model_name: str = "",
19
+ ) -> bool:
20
+ if not start_run(object_name):
21
+ return False
22
+
23
+ object_path = objects.object_path(object_name, create=True)
24
+
25
+ if env.MLFLOW_LOG_ARTIFACTS:
26
+ try:
27
+ mlflow.log_artifacts(object_path)
28
+
29
+ logger.info("⬆️ {}".format(object_name))
30
+
31
+ # https://mlflow.org/docs/latest/python_api/mlflow.html#mlflow.register_model
32
+ # https://stackoverflow.com/a/71447758/17619982
33
+ if model_name:
34
+ mv = mlflow.register_model(
35
+ "runs:/{}".format(mlflow.active_run().info.run_id),
36
+ model_name,
37
+ await_registration_for=0,
38
+ )
39
+
40
+ logger.info("*️⃣ {} -> {}.{}".format(object_name, mv.name, mv.version))
41
+
42
+ except:
43
+ crash_report(f"{NAME}.log_artifacts({object_name})")
44
+ return False
45
+ else:
46
+ logger.info("skipped log artifacts.")
47
+
48
+ return end_run(object_name)
49
+
50
+
51
+ def log_run(object_name: str) -> bool:
52
+ if not start_run(object_name):
53
+ return False
54
+
55
+ object_path = objects.object_path(object_name, create=True)
56
+
57
+ if env.MLFLOW_LOG_ARTIFACTS:
58
+ counts: Dict[str, int] = {}
59
+ skipped_count = 0
60
+ for extension in "dot,gif,jpeg,jpg,json,png,sh,xml,yaml".split(","):
61
+ for filename in glob.glob(
62
+ os.path.join(object_path, f"*.{extension}"),
63
+ ):
64
+ filename_name = file.name(filename)
65
+
66
+ counts[len(filename_name)] = counts.get(len(filename_name), 0) + 1
67
+
68
+ if any(
69
+ [
70
+ file.size(filename) > 10 * 1024 * 1024,
71
+ filename_name.startswith("thumbnail"),
72
+ counts[len(filename_name)] > 20,
73
+ ]
74
+ ):
75
+ logger.info(f"skipping {filename}")
76
+ skipped_count += 1
77
+ continue
78
+
79
+ mlflow.log_artifact(filename)
80
+ logger.info(f"⬆️ {filename}")
81
+
82
+ if skipped_count:
83
+ logger.info(f"skipped {skipped_count:,} file(s).")
84
+ else:
85
+ logger.info("skipped log artifacts.")
86
+
87
+ return end_run(object_name)
@@ -31,6 +31,12 @@ def test_bluer_objects_env():
31
31
 
32
32
  assert env.MLFLOW_DEPLOYMENT
33
33
 
34
+ assert isinstance(env.MLFLOW_LOCK_WAIT_FOR_CLEARANCE, int)
35
+ assert env.MLFLOW_LOCK_WAIT_FOR_CLEARANCE > 0
36
+
37
+ assert isinstance(env.MLFLOW_LOCK_WAIT_FOR_EXCLUSIVITY, int)
38
+ assert env.MLFLOW_LOCK_WAIT_FOR_EXCLUSIVITY > 0
39
+
34
40
  assert env.WEBDAV_HOSTNAME
35
41
  assert env.WEBDAV_LOGIN
36
42
  assert env.WEBDAV_PASSWORD
@@ -0,0 +1,26 @@
1
+ from bluer_options import string
2
+
3
+ from bluer_objects import objects
4
+ from bluer_objects.mlflow.lock.functions import lock, unlock
5
+
6
+
7
+ def test_mlflow_lock():
8
+ object_name = objects.unique_object("test_mlflow_lock")
9
+ lock_name = "lock-{}".format(string.random())
10
+
11
+ assert lock(
12
+ object_name=object_name,
13
+ lock_name=lock_name,
14
+ timeout=10,
15
+ )
16
+
17
+ assert not lock(
18
+ object_name=object_name,
19
+ lock_name=lock_name,
20
+ timeout=10,
21
+ )
22
+
23
+ assert unlock(
24
+ object_name=object_name,
25
+ lock_name=lock_name,
26
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bluer_objects
3
- Version: 6.151.1
3
+ Version: 6.164.1
4
4
  Summary: 🌀 Object management in Bash.
5
5
  Home-page: https://github.com/kamangir/bluer-objects
6
6
  Author: Arash Abadpour (Kamangir)
@@ -36,7 +36,7 @@ Dynamic: summary
36
36
 
37
37
  🌀 `bluer-objects` are the inputs and outputs of [AI algo](https://github.com/kamangir/giza). They are maintained in cloud storage (supports [WebDav](https://pypi.org/project/webdavclient3/)) and their metadata is tracked by [MLflow](https://mlflow.org/). Examples are the Sentinel-2 [datacube](https://github.com/kamangir/blue-geo/tree/main/blue_geo/datacube) `datacube-EarthSearch-sentinel_2_l1c-S2A_10UDC_20240731_0_L1C` and 🌐 [`@geo watch` outputs](https://github.com/kamangir/blue-geo/tree/main/blue_geo/watch).
38
38
 
39
- Also home to 🌀 [bluer README](https://github.com/kamangir/bluer-objects/blob/main/bluer_objects/README/).
39
+ Also home to 🌀 [bluer README](https://github.com/kamangir/bluer-objects/blob/main/bluer_objects/README/), and the 🔒 [`Lock`](https://github.com/kamangir/bluer-objects/blob/main/bluer_objects/mlflow/lock/).
40
40
 
41
41
  # installation
42
42
 
@@ -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.151.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.164.1`](https://github.com/kamangir/bluer-objects).
68
68
 
69
69
  built by 🌀 [`blueness-3.118.1`](https://github.com/kamangir/blueness).
@@ -42,12 +42,15 @@ bluer_objects/.abcli/mlflow/browse.sh
42
42
  bluer_objects/.abcli/mlflow/cache.sh
43
43
  bluer_objects/.abcli/mlflow/deploy.sh
44
44
  bluer_objects/.abcli/mlflow/list_registered_models.sh
45
+ bluer_objects/.abcli/mlflow/lock.sh
45
46
  bluer_objects/.abcli/mlflow/log_artifacts.sh
46
47
  bluer_objects/.abcli/mlflow/log_run.sh
47
48
  bluer_objects/.abcli/mlflow/run.sh
48
49
  bluer_objects/.abcli/mlflow/tags.sh
49
50
  bluer_objects/.abcli/mlflow/test.sh
50
51
  bluer_objects/.abcli/mlflow/transition.sh
52
+ bluer_objects/.abcli/mlflow/lock/lock.sh
53
+ bluer_objects/.abcli/mlflow/lock/unlock.sh
51
54
  bluer_objects/.abcli/mlflow/tags/clone.sh
52
55
  bluer_objects/.abcli/mlflow/tags/get.sh
53
56
  bluer_objects/.abcli/mlflow/tags/search.sh
@@ -67,6 +70,7 @@ bluer_objects/.abcli/tests/host.sh
67
70
  bluer_objects/.abcli/tests/ls.sh
68
71
  bluer_objects/.abcli/tests/metadata.sh
69
72
  bluer_objects/.abcli/tests/mlflow_cache.sh
73
+ bluer_objects/.abcli/tests/mlflow_lock.sh
70
74
  bluer_objects/.abcli/tests/mlflow_logging.sh
71
75
  bluer_objects/.abcli/tests/mlflow_tags.sh
72
76
  bluer_objects/.abcli/tests/mlflow_test.sh
@@ -101,6 +105,7 @@ bluer_objects/help/metadata.py
101
105
  bluer_objects/help/upload.py
102
106
  bluer_objects/help/mlflow/__init__.py
103
107
  bluer_objects/help/mlflow/cache.py
108
+ bluer_objects/help/mlflow/lock.py
104
109
  bluer_objects/help/mlflow/tags.py
105
110
  bluer_objects/host/__init__.py
106
111
  bluer_objects/host/__main__.py
@@ -149,6 +154,7 @@ bluer_objects/tests/test_logger_matrix.py
149
154
  bluer_objects/tests/test_markdown.py
150
155
  bluer_objects/tests/test_metadata.py
151
156
  bluer_objects/tests/test_mlflow.py
157
+ bluer_objects/tests/test_mlflow_lock.py
152
158
  bluer_objects/tests/test_objects.py
153
159
  bluer_objects/tests/test_path.py
154
160
  bluer_objects/tests/test_storage.py
@@ -1,5 +0,0 @@
1
- ABCLI_MLFLOW_EXPERIMENT_PREFIX=experiment/
2
-
3
- S3_STORAGE_BUCKET=kamangir
4
-
5
- BLUER_OBJECTS_STORAGE_INTERFACE=s3
@@ -1,81 +0,0 @@
1
- from typing import Dict
2
- import os
3
- import glob
4
- import mlflow
5
-
6
- from blueness import module
7
- from bluer_options.logger import crash_report
8
-
9
- from bluer_objects import file, objects, NAME
10
- from bluer_objects.mlflow.runs import start_run, end_run
11
- from bluer_objects.logger import logger
12
-
13
- NAME = module.name(__file__, NAME)
14
-
15
-
16
- def log_artifacts(
17
- object_name: str,
18
- model_name: str = "",
19
- ) -> bool:
20
- if not start_run(object_name):
21
- return False
22
-
23
- object_path = objects.object_path(object_name, create=True)
24
-
25
- try:
26
- mlflow.log_artifacts(object_path)
27
-
28
- logger.info("⬆️ {}".format(object_name))
29
-
30
- # https://mlflow.org/docs/latest/python_api/mlflow.html#mlflow.register_model
31
- # https://stackoverflow.com/a/71447758/17619982
32
- if model_name:
33
- mv = mlflow.register_model(
34
- "runs:/{}".format(mlflow.active_run().info.run_id),
35
- model_name,
36
- await_registration_for=0,
37
- )
38
-
39
- logger.info("*️⃣ {} -> {}.{}".format(object_name, mv.name, mv.version))
40
-
41
- except:
42
- crash_report(f"{NAME}.log_artifacts({object_name})")
43
- return False
44
-
45
- return end_run(object_name)
46
-
47
-
48
- def log_run(object_name: str) -> bool:
49
- if not start_run(object_name):
50
- return False
51
-
52
- object_path = objects.object_path(object_name, create=True)
53
-
54
- counts: Dict[str, int] = {}
55
- skipped_count = 0
56
- for extension in "dot,gif,jpeg,jpg,json,png,sh,xml,yaml".split(","):
57
- for filename in glob.glob(
58
- os.path.join(object_path, f"*.{extension}"),
59
- ):
60
- filename_name = file.name(filename)
61
-
62
- counts[len(filename_name)] = counts.get(len(filename_name), 0) + 1
63
-
64
- if any(
65
- [
66
- file.size(filename) > 10 * 1024 * 1024,
67
- filename_name.startswith("thumbnail"),
68
- counts[len(filename_name)] > 20,
69
- ]
70
- ):
71
- logger.info(f"skipping {filename}")
72
- skipped_count += 1
73
- continue
74
-
75
- mlflow.log_artifact(filename)
76
- logger.info(f"⬆️ {filename}")
77
-
78
- if skipped_count:
79
- logger.info(f"skipped {skipped_count:,} file(s).")
80
-
81
- return end_run(object_name)
File without changes