bluer-objects 6.25.1__tar.gz → 6.27.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 (148) hide show
  1. {bluer_objects-6.25.1/bluer_objects.egg-info → bluer_objects-6.27.1}/PKG-INFO +4 -3
  2. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/README.md +2 -2
  3. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/alias.sh +3 -3
  4. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/clone.sh +6 -6
  5. bluer_objects-6.27.1/bluer_objects/.abcli/download.sh +22 -0
  6. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/gif.sh +2 -2
  7. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/mlflow.sh +1 -1
  8. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/publish.sh +3 -3
  9. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/tests/ls.sh +1 -1
  10. bluer_objects-6.27.1/bluer_objects/.abcli/tests/storage.sh +60 -0
  11. bluer_objects-6.27.1/bluer_objects/.abcli/upload.sh +21 -0
  12. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/__init__.py +1 -1
  13. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/config.env +3 -1
  14. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/env.py +6 -1
  15. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/file/__main__.py +15 -2
  16. bluer_objects-6.27.1/bluer_objects/help/download.py +23 -0
  17. bluer_objects-6.27.1/bluer_objects/help/functions.py +14 -0
  18. bluer_objects-6.27.1/bluer_objects/help/upload.py +20 -0
  19. bluer_objects-6.27.1/bluer_objects/host/__init__.py +12 -0
  20. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/host/__main__.py +0 -1
  21. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/host/functions.py +14 -1
  22. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/metadata/get.py +2 -2
  23. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/metadata/post.py +2 -1
  24. bluer_objects-6.27.1/bluer_objects/sample.env +3 -0
  25. bluer_objects-6.27.1/bluer_objects/storage/WebDAV.py +114 -0
  26. bluer_objects-6.27.1/bluer_objects/storage/WebDAVzip.py +84 -0
  27. bluer_objects-6.27.1/bluer_objects/storage/__init__.py +39 -0
  28. bluer_objects-6.27.1/bluer_objects/storage/__main__.py +44 -0
  29. bluer_objects-6.27.1/bluer_objects/storage/base.py +37 -0
  30. bluer_objects-6.27.1/bluer_objects/tests/test_download.py +52 -0
  31. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/tests/test_env.py +11 -0
  32. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/tests/test_graphics.py +2 -1
  33. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/tests/test_graphics_gif.py +2 -1
  34. bluer_objects-6.27.1/bluer_objects/tests/test_objects.py +66 -0
  35. bluer_objects-6.27.1/bluer_objects/tests/test_upload.py +76 -0
  36. {bluer_objects-6.25.1 → bluer_objects-6.27.1/bluer_objects.egg-info}/PKG-INFO +4 -3
  37. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects.egg-info/SOURCES.txt +11 -2
  38. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects.egg-info/requires.txt +1 -0
  39. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/requirements.txt +1 -0
  40. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/setup.py +1 -0
  41. bluer_objects-6.25.1/bluer_objects/.abcli/download.sh +0 -53
  42. bluer_objects-6.25.1/bluer_objects/.abcli/tags.sh +0 -5
  43. bluer_objects-6.25.1/bluer_objects/.abcli/upload.sh +0 -73
  44. bluer_objects-6.25.1/bluer_objects/help/functions.py +0 -5
  45. bluer_objects-6.25.1/bluer_objects/host/__init__.py +0 -1
  46. bluer_objects-6.25.1/bluer_objects/sample.env +0 -16
  47. bluer_objects-6.25.1/bluer_objects/tests/test_objects.py +0 -180
  48. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/LICENSE +0 -0
  49. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/MANIFEST.in +0 -0
  50. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/abcli.sh +0 -0
  51. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/actions.sh +0 -0
  52. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/aka.sh +0 -0
  53. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/bluer_objects.sh +0 -0
  54. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/cache.sh +0 -0
  55. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/file.sh +0 -0
  56. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/host.sh +0 -0
  57. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/ls.sh +0 -0
  58. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/metadata/get.sh +0 -0
  59. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/metadata/post.sh +0 -0
  60. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/metadata.sh +0 -0
  61. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/mlflow/browse.sh +0 -0
  62. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/mlflow/cache.sh +0 -0
  63. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/mlflow/list_registered_models.sh +0 -0
  64. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/mlflow/log_artifacts.sh +0 -0
  65. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/mlflow/log_run.sh +0 -0
  66. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/mlflow/run.sh +0 -0
  67. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/mlflow/tags/clone.sh +0 -0
  68. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/mlflow/tags/get.sh +0 -0
  69. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/mlflow/tags/search.sh +0 -0
  70. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/mlflow/tags/set.sh +0 -0
  71. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/mlflow/tags.sh +0 -0
  72. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/mlflow/test.sh +0 -0
  73. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/mlflow/transition.sh +0 -0
  74. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/object.sh +0 -0
  75. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/select.sh +0 -0
  76. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/storage/clear.sh +0 -0
  77. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/storage/download_file.sh +0 -0
  78. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/storage/exists.sh +0 -0
  79. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/storage/list.sh +0 -0
  80. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/storage/rm.sh +0 -0
  81. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/storage/status.sh +0 -0
  82. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/storage.sh +0 -0
  83. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/tests/README.sh +0 -0
  84. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/tests/clone.sh +0 -0
  85. /bluer_objects-6.25.1/bluer_objects/.abcli/tests/test_gif.sh → /bluer_objects-6.27.1/bluer_objects/.abcli/tests/gif.sh +0 -0
  86. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/tests/help.sh +0 -0
  87. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/tests/host.sh +0 -0
  88. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/tests/metadata.sh +0 -0
  89. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/tests/mlflow_cache.sh +0 -0
  90. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/tests/mlflow_logging.sh +0 -0
  91. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/tests/mlflow_tags.sh +0 -0
  92. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/tests/mlflow_test.sh +0 -0
  93. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/.abcli/tests/version.sh +0 -0
  94. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/README/__init__.py +0 -0
  95. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/README/functions.py +0 -0
  96. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/README/items.py +0 -0
  97. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/__main__.py +0 -0
  98. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/file/__init__.py +0 -0
  99. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/file/classes.py +0 -0
  100. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/file/functions.py +0 -0
  101. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/file/load.py +0 -0
  102. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/file/save.py +0 -0
  103. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/graphics/__init__.py +0 -0
  104. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/graphics/__main__.py +0 -0
  105. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/graphics/frame.py +0 -0
  106. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/graphics/gif.py +0 -0
  107. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/graphics/screen.py +0 -0
  108. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/graphics/signature.py +0 -0
  109. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/graphics/text.py +0 -0
  110. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/help/__init__.py +0 -0
  111. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/help/__main__.py +0 -0
  112. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/logger/__init__.py +0 -0
  113. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/logger/matrix.py +0 -0
  114. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/markdown.py +0 -0
  115. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/metadata/__init__.py +0 -0
  116. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/metadata/__main__.py +0 -0
  117. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/metadata/enums.py +0 -0
  118. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/mlflow/__init__.py +0 -0
  119. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/mlflow/__main__.py +0 -0
  120. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/mlflow/cache.py +0 -0
  121. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/mlflow/logging.py +0 -0
  122. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/mlflow/models.py +0 -0
  123. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/mlflow/objects.py +0 -0
  124. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/mlflow/runs.py +0 -0
  125. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/mlflow/tags.py +0 -0
  126. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/mlflow/testing.py +0 -0
  127. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/objects.py +0 -0
  128. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/path.py +0 -0
  129. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/tests/__init__.py +0 -0
  130. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/tests/test_README.py +0 -0
  131. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/tests/test_file_load_save.py +0 -0
  132. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/tests/test_fullname.py +0 -0
  133. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/tests/test_graphics_frame.py +0 -0
  134. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/tests/test_graphics_screen.py +0 -0
  135. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/tests/test_graphics_signature.py +0 -0
  136. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/tests/test_graphics_text.py +0 -0
  137. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/tests/test_logger.py +0 -0
  138. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/tests/test_logger_matrix.py +0 -0
  139. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/tests/test_markdown.py +0 -0
  140. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/tests/test_metadata.py +0 -0
  141. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/tests/test_mlflow.py +0 -0
  142. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/tests/test_path.py +0 -0
  143. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/tests/test_version.py +0 -0
  144. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects/urls.py +0 -0
  145. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects.egg-info/dependency_links.txt +0 -0
  146. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/bluer_objects.egg-info/top_level.txt +0 -0
  147. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/pyproject.toml +0 -0
  148. {bluer_objects-6.25.1 → bluer_objects-6.27.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bluer_objects
3
- Version: 6.25.1
3
+ Version: 6.27.1
4
4
  Summary: 🌀 data objects for Bash.
5
5
  Home-page: https://github.com/kamangir/bluer-objects
6
6
  Author: Arash Abadpour (Kamangir)
@@ -13,6 +13,7 @@ Classifier: Operating System :: OS Independent
13
13
  Description-Content-Type: text/markdown
14
14
  License-File: LICENSE
15
15
  Requires-Dist: bluer_ai
16
+ Requires-Dist: webdavclient3
16
17
  Requires-Dist: dill
17
18
  Requires-Dist: mlflow
18
19
  Requires-Dist: pandas
@@ -33,7 +34,7 @@ Dynamic: summary
33
34
 
34
35
  # 🌀 bluer-objects
35
36
 
36
- 🌀 `bluer-objects` are the inputs and outputs of [AI algo](https://github.com/kamangir/giza). They are maintained in cloud storage and their metadata is tracked by [MLflow](https://mlflow.org/).
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/).
37
38
 
38
39
  For example, 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) are `bluer-objects`.
39
40
 
@@ -52,6 +53,6 @@ Also home to [blue README](https://github.com/kamangir/bluer-objects/blob/main/b
52
53
 
53
54
  [![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)
54
55
 
55
- built by 🌀 [`bluer_options-5.24.1`](https://github.com/kamangir/awesome-bash-cli), based on 🌀 [`bluer_objects-6.25.1`](https://github.com/kamangir/bluer-objects).
56
+ built by 🌀 [`bluer_options-5.26.1`](https://github.com/kamangir/awesome-bash-cli), based on 🌀 [`bluer_objects-6.27.1`](https://github.com/kamangir/bluer-objects).
56
57
 
57
58
  built by 🌀 [`blueness-3.96.1`](https://github.com/kamangir/blueness).
@@ -1,6 +1,6 @@
1
1
  # 🌀 bluer-objects
2
2
 
3
- 🌀 `bluer-objects` are the inputs and outputs of [AI algo](https://github.com/kamangir/giza). They are maintained in cloud storage and their metadata is tracked by [MLflow](https://mlflow.org/).
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/).
4
4
 
5
5
  For example, 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) are `bluer-objects`.
6
6
 
@@ -19,4 +19,4 @@ Also home to [blue README](./bluer_objects/README/).
19
19
 
20
20
  [![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)
21
21
 
22
- built by 🌀 [`bluer_options-5.24.1`](https://github.com/kamangir/awesome-bash-cli), based on 🌀 [`bluer_objects-6.25.1`](https://github.com/kamangir/bluer-objects).
22
+ built by 🌀 [`bluer_options-5.26.1`](https://github.com/kamangir/awesome-bash-cli), based on 🌀 [`bluer_objects-6.27.1`](https://github.com/kamangir/bluer-objects).
@@ -2,7 +2,7 @@
2
2
 
3
3
  alias @ai=bluer_ai
4
4
 
5
- alias @download=abcli_download
5
+ alias @download=bluer_objects_download
6
6
 
7
7
  alias @gif=abcli_gif
8
8
 
@@ -10,7 +10,7 @@ alias @assets=abcli_assets
10
10
 
11
11
  alias @cache=abcli_cache
12
12
  alias @ref="abcli_cache read"
13
- alias @tags=abcli_tags
13
+ alias @tags=abcli_mlflow_tags
14
14
 
15
15
  alias @clone=abcli_clone
16
16
  alias @cp=abcli_clone
@@ -33,4 +33,4 @@ alias @publish=bluer_ai_publish
33
33
 
34
34
  alias @select=bluer_ai_select
35
35
 
36
- alias @upload=abcli_upload
36
+ alias @upload=bluer_objects_upload
@@ -22,12 +22,12 @@ function abcli_clone() {
22
22
  [[ $? -ne 0 ]] && return 1
23
23
 
24
24
  [[ "$do_relate" == 1 ]] &&
25
- abcli_tags set \
25
+ abcli_mlflow_tags set \
26
26
  $object_name \
27
27
  cloned.$s3_uri
28
28
 
29
29
  [[ "$do_upload" == 1 ]] &&
30
- abcli_upload - $object_name
30
+ bluer_objects_upload - $object_name
31
31
 
32
32
  return 0
33
33
  fi
@@ -43,7 +43,7 @@ function abcli_clone() {
43
43
  abcli_log "$object_1_name -clone:$transfer_mechanism-> $object_2_name"
44
44
 
45
45
  [[ "$do_download" == 1 ]] &&
46
- abcli_download - $object_1_name
46
+ bluer_objects_download - $object_1_name
47
47
 
48
48
  local object_1_path=$ABCLI_OBJECT_ROOT/$object_1_name
49
49
  local object_2_path=$ABCLI_OBJECT_ROOT/$object_2_name
@@ -64,12 +64,12 @@ function abcli_clone() {
64
64
  fi
65
65
 
66
66
  [[ "$clone_tags" == 1 ]] &&
67
- abcli_tags clone \
67
+ abcli_mlflow_tags clone \
68
68
  $object_1_name \
69
69
  $object_2_name
70
70
 
71
71
  [[ "$do_relate" == 1 ]] &&
72
- abcli_tags set \
72
+ abcli_mlflow_tags set \
73
73
  $object_2_name \
74
74
  cloned.$object_1_name
75
75
 
@@ -88,7 +88,7 @@ function abcli_clone() {
88
88
  $object_2_path/metadata-$object_1_name.yaml
89
89
 
90
90
  [[ "$do_upload" == 1 ]] &&
91
- abcli_upload - $object_2_name
91
+ bluer_objects_upload - $object_2_name
92
92
 
93
93
  return 0
94
94
  }
@@ -0,0 +1,22 @@
1
+ #! /usr/bin/env bash
2
+
3
+ function bluer_objects_download() {
4
+ local options=$1
5
+ local filename=$(abcli_option "$options" filename)
6
+
7
+ local object_name=$(abcli_clarify_object $2 .)
8
+
9
+ python3 -m bluer_objects.storage \
10
+ download \
11
+ --object_name $object_name \
12
+ --filename "$filename"
13
+ [[ $? -ne 0 ]] && return 1
14
+
15
+ local open_options=$3
16
+ local do_open=$(abcli_option_int "$open_options" open 0)
17
+ [[ "$do_open" == 0 ]] &&
18
+ return 0
19
+
20
+ bluer_ai_open filename=$filename,$open_options \
21
+ $object_name
22
+ }
@@ -9,7 +9,7 @@ function abcli_gif() {
9
9
  local object_name=$(abcli_clarify_object $2 .)
10
10
 
11
11
  [[ "$do_download" == 1 ]] &&
12
- abcli_download - $object_name
12
+ bluer_objects_download - $object_name
13
13
 
14
14
  abcli_log "generating animated gif: $object_name ..."
15
15
 
@@ -21,7 +21,7 @@ function abcli_gif() {
21
21
  local status="$?"
22
22
 
23
23
  [[ "$do_upload" == 1 ]] &&
24
- abcli_upload - $object_name
24
+ bluer_objects_upload - $object_name
25
25
 
26
26
  return $status
27
27
  }
@@ -1,6 +1,6 @@
1
1
  #! /usr/bin/env bash
2
2
 
3
- export MLFLOW_TRACKING_URI="databricks"
3
+ export MLFLOW_TRACKING_URI=$HOME/mlruns
4
4
 
5
5
  function abcli_mlflow() {
6
6
  local task=$1
@@ -9,16 +9,16 @@ function bluer_ai_publish() {
9
9
 
10
10
  local object_name=$(abcli_clarify_object $2 .)
11
11
  [[ "$do_download" == 1 ]] &&
12
- abcli_download - $object_name
12
+ bluer_objects_download - $object_name
13
13
 
14
- abcli_tags set $object_name published
14
+ abcli_mlflow_tags set $object_name published
15
15
 
16
16
  local public_object_name=$(abcli_option "$options" as $object_name)
17
17
 
18
18
  if [ "$do_tar" == 1 ]; then
19
19
  abcli_log "publishing $object_name -> $public_object_name.tar.gz"
20
20
 
21
- abcli_upload ~open,solid $object_name
21
+ bluer_objects_upload ~open,solid $object_name
22
22
  aws s3 cp \
23
23
  $ABCLI_S3_OBJECT_PREFIX/$object_name.tar.gz \
24
24
  s3://$ABCLI_AWS_S3_PUBLIC_BUCKET_NAME/$public_object_name.tar.gz
@@ -3,7 +3,7 @@
3
3
  function test_bluer_objects_ls() {
4
4
  bluer_ai_select
5
5
 
6
- abcli_upload
6
+ bluer_objects_upload
7
7
 
8
8
  bluer_ai_ls cloud
9
9
 
@@ -0,0 +1,60 @@
1
+ #! /usr/bin/env bash
2
+
3
+ function test_bluer_objects_storage() {
4
+ local options=$1
5
+
6
+ local object_name=test_bluer_objects_storage-$(abcli_string_timestamp_short)
7
+ local object_path=$ABCLI_OBJECT_ROOT/$object_name
8
+ mkdir -pv $object_path
9
+
10
+ local suffix
11
+ local extension=yaml
12
+ for suffix in this.$extension that.$extension subfolder/this.$extension subfolder/that.$extension; do
13
+ python3 -m bluer_objects.file \
14
+ create_a_file \
15
+ --filename $object_path/$suffix
16
+ done
17
+
18
+ # testing upload
19
+ abcli_hr
20
+
21
+ bluer_objects_upload \
22
+ filename=this.$extension \
23
+ $object_name
24
+ [[ $? -ne 0 ]] && return 1
25
+ abcli_hr
26
+
27
+ bluer_objects_upload \
28
+ filename=subfolder/this.$extension \
29
+ $object_name
30
+ [[ $? -ne 0 ]] && return 1
31
+ abcli_hr
32
+
33
+ bluer_objects_upload \
34
+ - \
35
+ $object_name
36
+ [[ $? -ne 0 ]] && return 1
37
+ abcli_hr
38
+
39
+ # clean-up
40
+ rm -rfv $object_path
41
+ abcli_hr
42
+
43
+ # testing download
44
+
45
+ bluer_objects_download \
46
+ filename=this.$extension \
47
+ $object_name
48
+ [[ $? -ne 0 ]] && return 1
49
+ abcli_hr
50
+
51
+ bluer_objects_download \
52
+ filename=subfolder/this.$extension \
53
+ $object_name
54
+ [[ $? -ne 0 ]] && return 1
55
+ abcli_hr
56
+
57
+ bluer_objects_download \
58
+ - \
59
+ $object_name
60
+ }
@@ -0,0 +1,21 @@
1
+ #! /usr/bin/env bash
2
+
3
+ function bluer_objects_upload() {
4
+ local options=$1
5
+ local filename=$(abcli_option "$options" filename)
6
+
7
+ local object_name=$(abcli_clarify_object $2 .)
8
+ local object_path=$ABCLI_OBJECT_ROOT/$object_name
9
+
10
+ rm -rf $object_path/auxiliary
11
+
12
+ python3 -m bluer_objects.storage \
13
+ upload \
14
+ --object_name $object_name \
15
+ --filename "$filename"
16
+ [[ $? -ne 0 ]] && return 1
17
+
18
+ if [[ -z "$filename" ]]; then
19
+ abcli_mlflow_log_run $object_name
20
+ fi
21
+ }
@@ -4,7 +4,7 @@ ICON = "🌀"
4
4
 
5
5
  DESCRIPTION = f"{ICON} data objects for Bash."
6
6
 
7
- VERSION = "6.25.1"
7
+ VERSION = "6.27.1"
8
8
 
9
9
  REPO_NAME = "bluer-objects"
10
10
 
@@ -4,4 +4,6 @@ DATABRICKS_WORKSPACE=abcli-v4
4
4
 
5
5
  ABCLI_MLFLOW_URL_SUBDOMAIN=ml
6
6
 
7
- ABCLI_MLFLOW_EXPERIMENT_PREFIX=/Users/kamangirblog@gmail.com/
7
+ ABCLI_MLFLOW_EXPERIMENT_PREFIX=experiment/
8
+
9
+ BLUER_OBJECTS_STORAGE_INTERFACE=webdavzip
@@ -42,5 +42,10 @@ DATABRICKS_TOKEN = get_env("DATABRICKS_TOKEN")
42
42
 
43
43
  ABCLI_MLFLOW_EXPERIMENT_PREFIX = get_env("ABCLI_MLFLOW_EXPERIMENT_PREFIX")
44
44
 
45
-
46
45
  ABCLI_S3_OBJECT_PREFIX = "to-be-removed"
46
+
47
+ BLUER_OBJECTS_STORAGE_INTERFACE = get_env("BLUER_OBJECTS_STORAGE_INTERFACE")
48
+
49
+ WEBDAV_HOSTNAME = get_env("WEBDAV_HOSTNAME")
50
+ WEBDAV_LOGIN = get_env("WEBDAV_LOGIN")
51
+ WEBDAV_PASSWORD = get_env("WEBDAV_PASSWORD")
@@ -14,7 +14,7 @@ parser = argparse.ArgumentParser(NAME)
14
14
  parser.add_argument(
15
15
  "task",
16
16
  type=str,
17
- help="replace|size",
17
+ help="create_a_file | replace | size",
18
18
  )
19
19
  parser.add_argument(
20
20
  "--filename",
@@ -30,10 +30,23 @@ parser.add_argument(
30
30
  type=str,
31
31
  help="<that-1+that-2+that-3>",
32
32
  )
33
+ parser.add_argument(
34
+ "--size",
35
+ type=int,
36
+ default=16,
37
+ )
33
38
  args = parser.parse_args()
34
39
 
35
40
  success = False
36
- if args.task == "replace":
41
+ if args.task == "create_a_file":
42
+ success = file.save_yaml(
43
+ args.filename,
44
+ {
45
+ string.random(length=args.size): string.random(length=args.size)
46
+ for _ in range(args.size)
47
+ },
48
+ )
49
+ elif args.task == "replace":
37
50
  logger.info(f"{NAME}.{args.task}: {args.this} -> {args.that} in {args.filename}")
38
51
 
39
52
  success, content = file.load_text(args.filename)
@@ -0,0 +1,23 @@
1
+ from typing import List
2
+
3
+ from bluer_options.terminal import show_usage, xtra
4
+
5
+
6
+ def help_download(
7
+ tokens: List[str],
8
+ mono: bool,
9
+ ) -> str:
10
+ options = "filename=<filename>"
11
+
12
+ open_options = "open,QGIS"
13
+
14
+ return show_usage(
15
+ [
16
+ "@download",
17
+ f"[{options}]",
18
+ "[.|<object-name>]",
19
+ f"[{open_options}]",
20
+ ],
21
+ "download <object-name>.",
22
+ mono=mono,
23
+ )
@@ -0,0 +1,14 @@
1
+ from bluer_ai.help.generic import help_functions as generic_help_functions
2
+
3
+ from bluer_objects import ALIAS
4
+ from bluer_objects.help.download import help_download
5
+ from bluer_objects.help.upload import help_upload
6
+
7
+ help_functions = generic_help_functions(plugin_name=ALIAS)
8
+
9
+ help_functions.update(
10
+ {
11
+ "download": help_download,
12
+ "upload": help_upload,
13
+ }
14
+ )
@@ -0,0 +1,20 @@
1
+ from typing import List
2
+
3
+ from bluer_options.terminal import show_usage, xtra
4
+
5
+
6
+ def help_upload(
7
+ tokens: List[str],
8
+ mono: bool,
9
+ ) -> str:
10
+ options = "filename=<filename>"
11
+
12
+ return show_usage(
13
+ [
14
+ "@upload",
15
+ f"[{options}]",
16
+ "[.|<object-name>]",
17
+ ],
18
+ "upload <object-name>.",
19
+ mono=mono,
20
+ )
@@ -0,0 +1,12 @@
1
+ from typing import List
2
+
3
+ from bluer_ai.host import signature as bluer_ai_signature
4
+
5
+ from bluer_objects import fullname
6
+ from bluer_objects.host.functions import shell, unzip, zip
7
+
8
+
9
+ def signature() -> List[str]:
10
+ return [
11
+ fullname(),
12
+ ] + bluer_ai_signature()
@@ -15,7 +15,6 @@ parser = argparse.ArgumentParser(NAME)
15
15
  parser.add_argument(
16
16
  "task",
17
17
  type=str,
18
- default="get",
19
18
  help="add_signature",
20
19
  )
21
20
  parser.add_argument(
@@ -61,6 +61,19 @@ def unzip(
61
61
  output_folder = file.path(zip_filename)
62
62
 
63
63
  return shell(
64
- command=f'unzip -q -o "{zip_filename}" -d "{output_folder}"',
64
+ command=f'unzip -o "{zip_filename}" -d "{output_folder}"',
65
+ log=log,
66
+ )
67
+
68
+
69
+ def zip(
70
+ zip_filename: str,
71
+ input_folder: str = "",
72
+ work_dir: str = ".",
73
+ log: bool = False,
74
+ ) -> bool:
75
+ return shell(
76
+ command=f'zip -r "{zip_filename}" "{input_folder}"',
77
+ work_dir=work_dir,
65
78
  log=log,
66
79
  )
@@ -2,7 +2,7 @@ from typing import Any
2
2
 
3
3
 
4
4
  from bluer_objects import file
5
- from bluer_objects import objects
5
+ from bluer_objects import storage
6
6
  from bluer_objects.metadata.enums import MetadataSourceType
7
7
 
8
8
 
@@ -59,7 +59,7 @@ def get_from_object(
59
59
  download: bool = False,
60
60
  **kwargs,
61
61
  ) -> Any:
62
- if download and not objects.download(
62
+ if download and not storage.download(
63
63
  object_name=object_name,
64
64
  filename="metadata.yaml",
65
65
  ):
@@ -7,6 +7,7 @@ from blueness import module
7
7
  from bluer_objects.metadata.enums import MetadataSourceType
8
8
  from bluer_objects import NAME, file
9
9
  from bluer_objects import objects
10
+ from bluer_objects import storage
10
11
  from bluer_objects.logger import logger
11
12
 
12
13
  NAME = module.name(__file__, NAME)
@@ -65,7 +66,7 @@ def post_to_object(
65
66
  upload: bool = False,
66
67
  **kwargs,
67
68
  ) -> bool:
68
- if download and not objects.download(
69
+ if download and not storage.download(
69
70
  object_name=object_name,
70
71
  filename="metadata.yaml",
71
72
  ):
@@ -0,0 +1,3 @@
1
+ WEBDAV_HOSTNAME=
2
+ WEBDAV_LOGIN=
3
+ WEBDAV_PASSWORD=
@@ -0,0 +1,114 @@
1
+ from webdav3.client import Client
2
+
3
+ from bluer_objects.storage.base import StorageInterface
4
+ from bluer_objects import env, file, path
5
+ from bluer_objects import objects
6
+ from bluer_objects.logger import logger
7
+
8
+
9
+ # https://chatgpt.com/c/67e06812-4af0-8005-b2ab-5f9a1eabbbe3
10
+ # https://pypi.org/project/webdavclient3/
11
+
12
+
13
+ # ❗️ fails on .txt, .json, .yaml, ... other files with 'content-length',
14
+ # see WebDAV.ipynb for details (set BLUER_OBJECTS_STORAGE_INTERFACE=webdav).
15
+ class WebDAVInterface(StorageInterface):
16
+ name = "webdav"
17
+
18
+ def __init__(self):
19
+ super().__init__()
20
+
21
+ config = {
22
+ "webdav_hostname": env.WEBDAV_HOSTNAME,
23
+ "webdav_login": env.WEBDAV_LOGIN,
24
+ "webdav_password": env.WEBDAV_PASSWORD,
25
+ }
26
+
27
+ self.client = Client(config)
28
+
29
+ def mkdir(
30
+ self,
31
+ path: str,
32
+ log: bool = True,
33
+ ) -> bool:
34
+ try:
35
+ if self.client.check(path):
36
+ return True
37
+
38
+ self.client.mkdir(path)
39
+ except Exception as e:
40
+ logger.error(e)
41
+ return False
42
+
43
+ if log:
44
+ logger.info(
45
+ "{}.mkdir: {}".format(
46
+ self.__class__.__name__,
47
+ path,
48
+ )
49
+ )
50
+
51
+ return True
52
+
53
+ def download(
54
+ self,
55
+ object_name: str,
56
+ filename: str = "",
57
+ log: bool = True,
58
+ ) -> bool:
59
+ local_path = objects.path_of(
60
+ object_name=object_name,
61
+ filename=filename,
62
+ create=True,
63
+ )
64
+
65
+ if filename:
66
+ if not path.create(file.path(local_path)):
67
+ return False
68
+
69
+ try:
70
+ self.client.download_sync(
71
+ remote_path=f"{object_name}/{filename}",
72
+ local_path=local_path,
73
+ )
74
+ except Exception as e:
75
+ logger.error(e)
76
+ return False
77
+
78
+ return super().download(
79
+ object_name=object_name,
80
+ filename=filename,
81
+ log=log,
82
+ )
83
+
84
+ def upload(
85
+ self,
86
+ object_name: str,
87
+ filename: str = "",
88
+ log: bool = True,
89
+ ) -> bool:
90
+ if filename:
91
+ remote_dir = "/".join([object_name] + filename.split("/")[:-1])
92
+ if not self.mkdir(
93
+ path=remote_dir,
94
+ log=log,
95
+ ):
96
+ return False
97
+
98
+ try:
99
+ self.client.upload_sync(
100
+ remote_path=f"{object_name}/{filename}",
101
+ local_path=objects.path_of(
102
+ object_name=object_name,
103
+ filename=filename,
104
+ ),
105
+ )
106
+ except Exception as e:
107
+ logger.error(e)
108
+ return False
109
+
110
+ return super().upload(
111
+ object_name=object_name,
112
+ filename=filename,
113
+ log=log,
114
+ )