bluer-objects 6.223.1__tar.gz → 6.231.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 (187) hide show
  1. {bluer_objects-6.223.1/bluer_objects.egg-info → bluer_objects-6.231.1}/PKG-INFO +2 -2
  2. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/README.md +1 -1
  3. bluer_objects-6.231.1/bluer_objects/README/functions.py +186 -0
  4. bluer_objects-6.231.1/bluer_objects/README/utils.py +235 -0
  5. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/__init__.py +1 -1
  6. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/storage/WebDAV.py +3 -0
  7. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/storage/WebDAVrequest.py +4 -0
  8. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/storage/WebDAVzip.py +5 -2
  9. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/storage/__init__.py +3 -0
  10. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/storage/base.py +8 -1
  11. bluer_objects-6.231.1/bluer_objects/storage/policies.py +7 -0
  12. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/storage/s3.py +9 -0
  13. {bluer_objects-6.223.1 → bluer_objects-6.231.1/bluer_objects.egg-info}/PKG-INFO +2 -2
  14. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects.egg-info/SOURCES.txt +2 -0
  15. bluer_objects-6.223.1/bluer_objects/README/functions.py +0 -297
  16. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/LICENSE +0 -0
  17. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/MANIFEST.in +0 -0
  18. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/abcli.sh +0 -0
  19. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/actions.sh +0 -0
  20. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/aka.sh +0 -0
  21. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/alias.sh +0 -0
  22. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/bluer_objects.sh +0 -0
  23. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/clone.sh +0 -0
  24. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/create_test_asset.sh +0 -0
  25. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/download.sh +0 -0
  26. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/file.sh +0 -0
  27. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/gif.sh +0 -0
  28. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/host.sh +0 -0
  29. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/ls.sh +0 -0
  30. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/metadata/get.sh +0 -0
  31. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/metadata/post.sh +0 -0
  32. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/metadata.sh +0 -0
  33. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/mlflow/browse.sh +0 -0
  34. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/mlflow/cache.sh +0 -0
  35. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/mlflow/deploy.sh +0 -0
  36. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/mlflow/list_registered_models.sh +0 -0
  37. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/mlflow/lock/lock.sh +0 -0
  38. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/mlflow/lock/unlock.sh +0 -0
  39. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/mlflow/lock.sh +0 -0
  40. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/mlflow/log_artifacts.sh +0 -0
  41. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/mlflow/log_run.sh +0 -0
  42. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/mlflow/run.sh +0 -0
  43. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/mlflow/tags/clone.sh +0 -0
  44. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/mlflow/tags/get.sh +0 -0
  45. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/mlflow/tags/search.sh +0 -0
  46. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/mlflow/tags/set.sh +0 -0
  47. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/mlflow/tags.sh +0 -0
  48. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/mlflow/test.sh +0 -0
  49. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/mlflow/transition.sh +0 -0
  50. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/mlflow.sh +0 -0
  51. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/object.sh +0 -0
  52. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/select.sh +0 -0
  53. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/storage/clear.sh +0 -0
  54. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/storage/download_file.sh +0 -0
  55. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/storage/exists.sh +0 -0
  56. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/storage/list.sh +0 -0
  57. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/storage/rm.sh +0 -0
  58. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/storage/status.sh +0 -0
  59. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/storage.sh +0 -0
  60. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/tests/README.sh +0 -0
  61. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/tests/clone.sh +0 -0
  62. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/tests/create_test_asset.sh +0 -0
  63. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/tests/gif.sh +0 -0
  64. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/tests/help.sh +0 -0
  65. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/tests/host.sh +0 -0
  66. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/tests/ls.sh +0 -0
  67. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/tests/metadata.sh +0 -0
  68. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/tests/mlflow_cache.sh +0 -0
  69. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/tests/mlflow_lock.sh +0 -0
  70. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/tests/mlflow_logging.sh +0 -0
  71. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/tests/mlflow_tags.sh +0 -0
  72. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/tests/mlflow_test.sh +0 -0
  73. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/tests/storage_public_upload.sh +0 -0
  74. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/tests/storage_upload_download.sh +0 -0
  75. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/tests/version.sh +0 -0
  76. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/tests/web_is_accessible.sh +0 -0
  77. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/tests/web_where_am_ai.sh +0 -0
  78. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/upload.sh +0 -0
  79. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/url.sh +0 -0
  80. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/web/is_accessible.sh +0 -0
  81. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/web/where_am_i.sh +0 -0
  82. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/README/__init__.py +0 -0
  83. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/README/items.py +0 -0
  84. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/__main__.py +0 -0
  85. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/config.env +0 -0
  86. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/env.py +0 -0
  87. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/file/__init__.py +0 -0
  88. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/file/__main__.py +0 -0
  89. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/file/classes.py +0 -0
  90. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/file/functions.py +0 -0
  91. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/file/load.py +0 -0
  92. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/file/save.py +0 -0
  93. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/graphics/__init__.py +0 -0
  94. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/graphics/__main__.py +0 -0
  95. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/graphics/frame.py +0 -0
  96. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/graphics/gif.py +0 -0
  97. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/graphics/screen.py +0 -0
  98. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/graphics/signature.py +0 -0
  99. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/graphics/text.py +0 -0
  100. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/help/__init__.py +0 -0
  101. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/help/__main__.py +0 -0
  102. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/help/clone.py +0 -0
  103. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/help/create_test_asset.py +0 -0
  104. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/help/download.py +0 -0
  105. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/help/functions.py +0 -0
  106. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/help/gif.py +0 -0
  107. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/help/host.py +0 -0
  108. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/help/ls.py +0 -0
  109. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/help/metadata.py +0 -0
  110. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/help/mlflow/__init__.py +0 -0
  111. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/help/mlflow/cache.py +0 -0
  112. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/help/mlflow/lock.py +0 -0
  113. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/help/mlflow/tags.py +0 -0
  114. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/help/upload.py +0 -0
  115. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/help/web.py +0 -0
  116. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/host/__init__.py +0 -0
  117. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/host/__main__.py +0 -0
  118. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/host/functions.py +0 -0
  119. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/logger/__init__.py +0 -0
  120. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/logger/image.py +0 -0
  121. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/logger/matrix.py +0 -0
  122. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/markdown.py +0 -0
  123. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/metadata/__init__.py +0 -0
  124. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/metadata/__main__.py +0 -0
  125. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/metadata/enums.py +0 -0
  126. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/metadata/get.py +0 -0
  127. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/metadata/post.py +0 -0
  128. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/mlflow/__init__.py +0 -0
  129. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/mlflow/__main__.py +0 -0
  130. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/mlflow/cache.py +0 -0
  131. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/mlflow/lock/__init__.py +0 -0
  132. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/mlflow/lock/__main__.py +0 -0
  133. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/mlflow/lock/functions.py +0 -0
  134. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/mlflow/logging.py +0 -0
  135. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/mlflow/models.py +0 -0
  136. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/mlflow/objects.py +0 -0
  137. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/mlflow/runs.py +0 -0
  138. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/mlflow/tags.py +0 -0
  139. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/mlflow/testing.py +0 -0
  140. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/objects.py +0 -0
  141. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/path.py +0 -0
  142. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/sample.env +0 -0
  143. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/storage/__main__.py +0 -0
  144. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/testing/__init__.py +0 -0
  145. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/testing/__main__.py +0 -0
  146. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/testing/functions.py +0 -0
  147. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/__init__.py +0 -0
  148. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_README.py +0 -0
  149. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_env.py +0 -0
  150. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_file_download.py +0 -0
  151. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_file_load_save.py +0 -0
  152. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_file_load_save_text.py +0 -0
  153. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_fullname.py +0 -0
  154. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_graphics.py +0 -0
  155. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_graphics_frame.py +0 -0
  156. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_graphics_gif.py +0 -0
  157. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_graphics_screen.py +0 -0
  158. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_graphics_signature.py +0 -0
  159. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_graphics_text.py +0 -0
  160. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_log_image_grid.py +0 -0
  161. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_logger.py +0 -0
  162. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_logger_matrix.py +0 -0
  163. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_markdown.py +0 -0
  164. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_metadata.py +0 -0
  165. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_mlflow.py +0 -0
  166. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_mlflow_lock.py +0 -0
  167. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_objects.py +0 -0
  168. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_path.py +0 -0
  169. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_storage.py +0 -0
  170. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_storage_base.py +0 -0
  171. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_storage_s3.py +0 -0
  172. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_storage_webdav_request.py +0 -0
  173. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_storage_webdav_zip.py +0 -0
  174. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_testing.py +0 -0
  175. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_version.py +0 -0
  176. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_web_is_accessible.py +0 -0
  177. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/urls.py +0 -0
  178. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/web/__init__.py +0 -0
  179. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/web/__main__.py +0 -0
  180. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/web/functions.py +0 -0
  181. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects.egg-info/dependency_links.txt +0 -0
  182. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects.egg-info/requires.txt +0 -0
  183. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects.egg-info/top_level.txt +0 -0
  184. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/pyproject.toml +0 -0
  185. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/requirements.txt +0 -0
  186. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/setup.cfg +0 -0
  187. {bluer_objects-6.223.1 → bluer_objects-6.231.1}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bluer_objects
3
- Version: 6.223.1
3
+ Version: 6.231.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.223.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.231.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.223.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.231.1`](https://github.com/kamangir/bluer-objects).
@@ -0,0 +1,186 @@
1
+ from typing import List, Dict, Union, Callable
2
+ import os
3
+ import yaml
4
+
5
+ from blueness import module
6
+
7
+ from bluer_objects import NAME as MY_NAME
8
+ from bluer_objects.metadata import get_from_object
9
+ from bluer_objects import file, env
10
+ from bluer_objects import markdown
11
+ from bluer_objects.README.utils import (
12
+ apply_legacy,
13
+ process_assets,
14
+ process_details,
15
+ process_envs,
16
+ process_help,
17
+ process_include,
18
+ process_mermaid,
19
+ process_objects,
20
+ process_variable,
21
+ signature,
22
+ variables,
23
+ )
24
+ from bluer_objects.logger import logger
25
+
26
+ MY_NAME = module.name(__file__, MY_NAME)
27
+
28
+
29
+ def build(
30
+ NAME: str,
31
+ VERSION: str,
32
+ REPO_NAME: str,
33
+ items: List[str] = [],
34
+ template_filename: str = "",
35
+ filename: str = "",
36
+ path: str = "",
37
+ cols: int = 3,
38
+ ICON: str = "",
39
+ MODULE_NAME: str = "",
40
+ macros: Dict[str, str] = {},
41
+ help_function: Union[Callable[[List[str]], str], None] = None,
42
+ legacy_mode: bool = True,
43
+ assets_repo: str = "kamangir/assets",
44
+ ) -> bool:
45
+ if path:
46
+ if path.endswith(".md"):
47
+ filename = path
48
+ template_filename = file.add_suffix(path, "template")
49
+ else:
50
+ filename = os.path.join(path, "README.md")
51
+ template_filename = os.path.join(path, "template.md")
52
+
53
+ if not MODULE_NAME:
54
+ MODULE_NAME = REPO_NAME
55
+
56
+ logger.info(
57
+ "{}.build: {}-{}: {}[{}]: {} -{}> {}".format(
58
+ MY_NAME,
59
+ NAME,
60
+ VERSION,
61
+ REPO_NAME,
62
+ MODULE_NAME,
63
+ template_filename,
64
+ "+legacy-" if legacy_mode else "",
65
+ filename,
66
+ )
67
+ )
68
+
69
+ table_of_items = markdown.generate_table(items, cols=cols) if cols > 0 else items
70
+
71
+ success, template = file.load_text(template_filename)
72
+ if not success:
73
+ return success
74
+
75
+ if legacy_mode:
76
+ template = apply_legacy(template)
77
+
78
+ content: List[str] = []
79
+ mermaid_started: bool = False
80
+ for template_line in template:
81
+ if template_line.startswith("ignore:::"):
82
+ content += [template_line.split(":::", 1)[1].strip()]
83
+ continue
84
+
85
+ template_line = process_envs(template_line)
86
+
87
+ for key, value in variables.items():
88
+ template_line = template_line.replace(
89
+ f"get:::{key}",
90
+ value,
91
+ )
92
+
93
+ if "metadata:::" in template_line:
94
+ object_name_and_key = template_line.split("metadata:::", 1)[1]
95
+ if " " in object_name_and_key:
96
+ object_name_and_key = object_name_and_key.split(" ", 1)[0]
97
+ if ":::" not in object_name_and_key:
98
+ object_name_and_key += ":::"
99
+ object_name, key = object_name_and_key.split(":::", 1)
100
+
101
+ value = get_from_object(
102
+ object_name,
103
+ key,
104
+ {},
105
+ download=True,
106
+ )
107
+
108
+ logger.info(f"metadata[{object_name_and_key}] = {value}")
109
+
110
+ if template_line.startswith("metadata:::"):
111
+ content += (
112
+ ["```yaml"]
113
+ + yaml.dump(
114
+ value,
115
+ default_flow_style=False,
116
+ ).split("\n")
117
+ + ["```"]
118
+ )
119
+ continue
120
+
121
+ template_line = template_line.replace(
122
+ f"metadata:::{object_name}:::{key}",
123
+ str(value),
124
+ )
125
+
126
+ if template_line.startswith("set:::"):
127
+ process_variable(template_line)
128
+ continue
129
+
130
+ template_line = process_assets(template_line, assets_repo)
131
+
132
+ template_line = process_objects(template_line)
133
+
134
+ if template_line.startswith("details:::"):
135
+ content += process_details(template_line)
136
+ continue
137
+
138
+ if "items:::" in template_line:
139
+ content += table_of_items
140
+ continue
141
+
142
+ if "include:::" in template_line:
143
+ content += process_include(
144
+ template_line,
145
+ file.path(template_filename),
146
+ )
147
+ continue
148
+
149
+ if "signature:::" in template_line:
150
+ content += signature(
151
+ REPO_NAME,
152
+ NAME,
153
+ ICON,
154
+ MODULE_NAME,
155
+ VERSION,
156
+ )
157
+ continue
158
+
159
+ if "help:::" in template_line:
160
+ if help_function is None:
161
+ logger.warning("help_function not found.")
162
+ else:
163
+ content += process_help(
164
+ template_line,
165
+ help_function,
166
+ )
167
+ continue
168
+
169
+ content_section = [template_line]
170
+ if template_line.startswith("```mermaid"):
171
+ mermaid_started = True
172
+ logger.info("🧜🏽‍♀️ detected ...")
173
+ elif mermaid_started and template_line.startswith("```"):
174
+ mermaid_started = False
175
+ elif mermaid_started:
176
+ if '"' in template_line and ":::folder" not in template_line:
177
+ content_section = process_mermaid(template_line)
178
+ else:
179
+ for macro, macro_value in macros.items():
180
+ if macro in template_line:
181
+ content_section = macro_value
182
+ break
183
+
184
+ content += content_section
185
+
186
+ return file.save_text(filename, content)
@@ -0,0 +1,235 @@
1
+ from typing import List, Tuple, Dict, Union, Callable
2
+
3
+ from bluer_options.env import get_env
4
+ from bluer_objects import file
5
+ from bluer_objects import env
6
+ from bluer_objects import NAME as MY_NAME, ICON as MY_ICON
7
+
8
+ from bluer_objects.logger import logger
9
+
10
+
11
+ variables: Dict[str, str] = {}
12
+
13
+
14
+ def apply_legacy_on_line(line: str) -> str:
15
+ for before, after in {
16
+ "yaml:::": "metadata:::",
17
+ "--help--": "help:::",
18
+ "--include": "include:::",
19
+ "--table--": "items:::",
20
+ "--signature--": "signature:::",
21
+ }.items():
22
+ line = line.replace(before, after)
23
+ return line
24
+
25
+
26
+ def apply_legacy(template: List[str]) -> List[str]:
27
+ logger.info("applying legacy conversions...")
28
+ template = [apply_legacy_on_line(line) for line in template]
29
+ return template
30
+
31
+
32
+ def process_assets(
33
+ template_line: str,
34
+ assets_repo: str,
35
+ ) -> str:
36
+ if "assets:::" in template_line:
37
+ template_line = " ".join(
38
+ [
39
+ (
40
+ (
41
+ "![image](https://github.com/{}/blob/main/{}?raw=true)".format(
42
+ assets_repo,
43
+ token.split(":::")[1].strip(),
44
+ )
45
+ if any(
46
+ token.endswith(extension)
47
+ for extension in ["png", "jpg", "jpeg", "gif"]
48
+ )
49
+ else "[{}](https://github.com/{}/blob/main/{})".format(
50
+ file.name_and_extension(token.split(":::")[1].strip()),
51
+ assets_repo,
52
+ token.split(":::")[1].strip(),
53
+ )
54
+ )
55
+ if token.startswith("assets:::")
56
+ else token
57
+ )
58
+ for token in template_line.split(" ")
59
+ ]
60
+ )
61
+
62
+ return template_line
63
+
64
+
65
+ def process_details(template_line: str) -> List[str]:
66
+ suffix = template_line.split(":::", 1)[1]
67
+ if suffix:
68
+ content_section = [
69
+ "",
70
+ "<details>",
71
+ f"<summary>{suffix}</summary>",
72
+ "",
73
+ ]
74
+ else:
75
+ content_section = [
76
+ "",
77
+ "</details>",
78
+ "",
79
+ ]
80
+
81
+ return content_section
82
+
83
+
84
+ def process_envs(template_line: str) -> str:
85
+ while "env:::" in template_line:
86
+ env_name = template_line.split("env:::", 1)[1]
87
+ if " " in env_name:
88
+ env_name = env_name.split(" ", 1)[0]
89
+ else:
90
+ if ":::" in env_name:
91
+ env_name = env_name.split(":::", 1)[0]
92
+
93
+ env_value = get_env(env_name)
94
+
95
+ template_line = template_line.replace(
96
+ f"env:::{env_name}",
97
+ env_value,
98
+ )
99
+ logger.info(f"{env_name} -> {env_value}")
100
+
101
+ return template_line
102
+
103
+
104
+ def process_help(
105
+ template_line: str,
106
+ help_function: Union[Callable[[List[str]], str], None] = None,
107
+ ) -> List[str]:
108
+ help_command = template_line.split("help:::")[1].strip()
109
+
110
+ tokens = help_command.strip().split(" ")[1:]
111
+
112
+ help_content = help_function(tokens)
113
+ if not help_content:
114
+ logger.warning(f"help not found: {help_command}: {tokens}")
115
+ return False
116
+
117
+ logger.info(f"+= help: {help_command}")
118
+ print(help_content)
119
+ content_section = [
120
+ "```bash",
121
+ help_content,
122
+ "```",
123
+ ]
124
+
125
+ return content_section
126
+
127
+
128
+ def process_include(
129
+ template_line: str,
130
+ template_path: str,
131
+ ) -> List[str]:
132
+ include_filename_relative = template_line.split(" ")[1].strip()
133
+ include_filename = file.absolute(
134
+ include_filename_relative,
135
+ template_path,
136
+ )
137
+
138
+ success, content_section = file.load_text(include_filename)
139
+ if not success:
140
+ return success
141
+
142
+ content_section = [
143
+ line for line in content_section if not line.startswith("used by:")
144
+ ]
145
+
146
+ include_title = (template_line.split(" ", 2) + ["", "", ""])[2]
147
+ if include_title:
148
+ content_section = [f"## {include_title}"] + content_section[1:]
149
+
150
+ if "include:::noref" not in template_line:
151
+ content_section += [
152
+ "using [{}]({}).".format(
153
+ file.name(include_filename),
154
+ include_filename_relative,
155
+ )
156
+ ]
157
+
158
+ logger.info(f"{MY_NAME}.build: including {include_filename} ...")
159
+
160
+ return content_section
161
+
162
+
163
+ def process_mermaid(template_line: str) -> List[str]:
164
+ template_line_pieces = template_line.split('"')
165
+ if len(template_line_pieces) != 3:
166
+ logger.error(f"🧜🏽‍♀️ mermaid line not in expected format: {template_line}.")
167
+ return False
168
+
169
+ template_line_pieces[1] = (
170
+ template_line_pieces[1]
171
+ .replace("<", "&lt;")
172
+ .replace(">", "&gt;")
173
+ .replace(" ", "<br>")
174
+ .replace("~~", " ")
175
+ )
176
+
177
+ return ['"'.join(template_line_pieces)]
178
+
179
+
180
+ def process_objects(template_line: str) -> str:
181
+ if "object:::" in template_line:
182
+ template_line = " ".join(
183
+ [
184
+ (
185
+ "[{}](https://{}.{}/{}.tar.gz)".format(
186
+ token.split(":::")[1].strip(),
187
+ env.S3_PUBLIC_STORAGE_BUCKET,
188
+ env.S3_STORAGE_ENDPOINT_URL.split("https://", 1)[1],
189
+ token.split(":::")[1].strip(),
190
+ )
191
+ if token.startswith("object:::")
192
+ else token
193
+ )
194
+ for token in template_line.split(" ")
195
+ ]
196
+ )
197
+
198
+ return template_line
199
+
200
+
201
+ def process_variable(template_line: str):
202
+ key, value = template_line.split("set:::", 1)[1].split(" ", 1)
203
+ variables[key] = value
204
+ logger.info(f"{key} = {value}")
205
+
206
+
207
+ def signature(
208
+ REPO_NAME: str,
209
+ NAME: str,
210
+ ICON: str,
211
+ MODULE_NAME: str,
212
+ VERSION: str,
213
+ ) -> List[str]:
214
+ return [
215
+ "",
216
+ " ".join(
217
+ [
218
+ f"[![pylint](https://github.com/kamangir/{REPO_NAME}/actions/workflows/pylint.yml/badge.svg)](https://github.com/kamangir/{REPO_NAME}/actions/workflows/pylint.yml)",
219
+ f"[![pytest](https://github.com/kamangir/{REPO_NAME}/actions/workflows/pytest.yml/badge.svg)](https://github.com/kamangir/{REPO_NAME}/actions/workflows/pytest.yml)",
220
+ f"[![bashtest](https://github.com/kamangir/{REPO_NAME}/actions/workflows/bashtest.yml/badge.svg)](https://github.com/kamangir/{REPO_NAME}/actions/workflows/bashtest.yml)",
221
+ f"[![PyPI version](https://img.shields.io/pypi/v/{MODULE_NAME}.svg)](https://pypi.org/project/{MODULE_NAME}/)",
222
+ f"[![PyPI - Downloads](https://img.shields.io/pypi/dd/{MODULE_NAME})](https://pypistats.org/packages/{MODULE_NAME})",
223
+ ]
224
+ ),
225
+ "",
226
+ "built by {} [`{}`]({}), based on {}[`{}-{}`]({}).".format(
227
+ MY_ICON,
228
+ "bluer README",
229
+ "https://github.com/kamangir/bluer-objects/tree/main/bluer_objects/README",
230
+ f"{ICON} " if ICON else "",
231
+ NAME,
232
+ VERSION,
233
+ f"https://github.com/kamangir/{REPO_NAME}",
234
+ ),
235
+ ]
@@ -4,7 +4,7 @@ ICON = "🌀"
4
4
 
5
5
  DESCRIPTION = f"{ICON} Object management in Bash."
6
6
 
7
- VERSION = "6.223.1"
7
+ VERSION = "6.231.1"
8
8
 
9
9
  REPO_NAME = "bluer-objects"
10
10
 
@@ -4,6 +4,7 @@ from webdav3.client import Client
4
4
  from bluer_objects.storage.base import StorageInterface
5
5
  from bluer_objects import env, file, path
6
6
  from bluer_objects import objects
7
+ from bluer_objects.storage.policies import DownloadPolicy
7
8
  from bluer_objects.logger import logger
8
9
 
9
10
 
@@ -56,6 +57,7 @@ class WebDAVInterface(StorageInterface):
56
57
  object_name: str,
57
58
  filename: str = "",
58
59
  log: bool = True,
60
+ policy: DownloadPolicy = DownloadPolicy.NONE,
59
61
  ) -> bool:
60
62
  local_path = objects.path_of(
61
63
  object_name=object_name,
@@ -80,6 +82,7 @@ class WebDAVInterface(StorageInterface):
80
82
  object_name=object_name,
81
83
  filename=filename,
82
84
  log=log,
85
+ policy=policy,
83
86
  )
84
87
 
85
88
  def upload(
@@ -8,6 +8,7 @@ from tqdm import tqdm
8
8
  from bluer_objects.storage.base import StorageInterface
9
9
  from bluer_objects import env, file, path
10
10
  from bluer_objects import objects
11
+ from bluer_objects.storage.policies import DownloadPolicy
11
12
  from bluer_objects.logger import logger
12
13
 
13
14
 
@@ -136,6 +137,7 @@ class WebDAVRequestInterface(StorageInterface):
136
137
  object_name: str,
137
138
  filename: str = "",
138
139
  log: bool = True,
140
+ policy: DownloadPolicy = DownloadPolicy.NONE,
139
141
  ) -> bool:
140
142
  if filename:
141
143
  local_path = objects.path_of(
@@ -176,6 +178,7 @@ class WebDAVRequestInterface(StorageInterface):
176
178
  object_name=object_name,
177
179
  filename=filename,
178
180
  log=log,
181
+ policy=policy,
179
182
  )
180
183
 
181
184
  logger.error(f"failed to download: {response.status_code}")
@@ -193,6 +196,7 @@ class WebDAVRequestInterface(StorageInterface):
193
196
  object_name=object_name,
194
197
  filename=filename_,
195
198
  log=log,
199
+ policy=policy,
196
200
  ):
197
201
  return False
198
202
 
@@ -5,9 +5,10 @@ from webdav3.client import Client
5
5
  from tqdm import tqdm
6
6
 
7
7
  from bluer_objects.storage.base import StorageInterface
8
- from bluer_objects import env, file, path
8
+ from bluer_objects import env
9
9
  from bluer_objects import objects
10
- from bluer_objects.host import zip, unzip
10
+ from bluer_objects.host import unzip
11
+ from bluer_objects.storage.policies import DownloadPolicy
11
12
  from bluer_objects.logger import logger
12
13
 
13
14
 
@@ -65,6 +66,7 @@ class WebDAVzipInterface(StorageInterface):
65
66
  object_name: str,
66
67
  filename: str = "",
67
68
  log: bool = True,
69
+ policy: DownloadPolicy = DownloadPolicy.NONE,
68
70
  ) -> bool:
69
71
  object_path = objects.object_path(
70
72
  object_name=object_name,
@@ -99,6 +101,7 @@ class WebDAVzipInterface(StorageInterface):
99
101
  return super().download(
100
102
  object_name=object_name,
101
103
  log=log,
104
+ policy=policy,
102
105
  )
103
106
 
104
107
  def ls(
@@ -5,6 +5,7 @@ from bluer_objects.storage.base import StorageInterface
5
5
  from bluer_objects.storage.WebDAV import WebDAVInterface
6
6
  from bluer_objects.storage.WebDAVrequest import WebDAVRequestInterface
7
7
  from bluer_objects.storage.WebDAVzip import WebDAVzipInterface
8
+ from bluer_objects.storage.policies import DownloadPolicy
8
9
  from bluer_objects import env
9
10
  from bluer_objects.logger import logger
10
11
 
@@ -35,11 +36,13 @@ def download(
35
36
  object_name: str,
36
37
  filename: str = "",
37
38
  log: bool = True,
39
+ policy: DownloadPolicy = DownloadPolicy.NONE,
38
40
  ) -> bool:
39
41
  return interface.download(
40
42
  object_name=object_name,
41
43
  filename=filename,
42
44
  log=log,
45
+ policy=policy,
43
46
  )
44
47
 
45
48
 
@@ -3,6 +3,7 @@ import glob
3
3
  from typing import Tuple, List
4
4
 
5
5
  from bluer_objects import objects
6
+ from bluer_objects.storage.policies import DownloadPolicy
6
7
  from bluer_objects.logger import logger
7
8
 
8
9
 
@@ -18,13 +19,19 @@ class StorageInterface:
18
19
  object_name: str,
19
20
  filename: str = "",
20
21
  log: bool = True,
22
+ policy: DownloadPolicy = DownloadPolicy.NONE,
21
23
  ) -> bool:
22
24
  if log:
23
25
  logger.info(
24
- "{}.download {}{}".format(
26
+ "{}.download {}{}{}".format(
25
27
  self.__class__.__name__,
26
28
  object_name,
27
29
  f"/{filename}" if filename else "",
30
+ (
31
+ ""
32
+ if policy == DownloadPolicy.NONE
33
+ else " - policy:{}".format(policy.name.lower())
34
+ ),
28
35
  )
29
36
  )
30
37
 
@@ -0,0 +1,7 @@
1
+ from enum import Enum, auto
2
+
3
+
4
+ class DownloadPolicy(Enum):
5
+ NONE = auto()
6
+ DOESNT_EXIST = auto()
7
+ DIFFERENT = auto()
@@ -11,6 +11,7 @@ from bluer_objects.storage.base import StorageInterface
11
11
  from bluer_objects.env import ABCLI_OBJECT_ROOT
12
12
  from bluer_objects import env, file, path
13
13
  from bluer_objects import objects
14
+ from bluer_objects.storage.policies import DownloadPolicy
14
15
  from bluer_objects.logger import logger
15
16
 
16
17
 
@@ -121,6 +122,7 @@ class S3Interface(StorageInterface):
121
122
  object_name: str,
122
123
  filename: str = "",
123
124
  log: bool = True,
125
+ policy: DownloadPolicy = DownloadPolicy.NONE,
124
126
  ) -> bool:
125
127
  if filename:
126
128
  local_path = objects.path_of(
@@ -129,6 +131,11 @@ class S3Interface(StorageInterface):
129
131
  create=True,
130
132
  )
131
133
 
134
+ if policy == DownloadPolicy.DOESNT_EXIST and file.exists(local_path):
135
+ if log:
136
+ logger.info(f"✅ {filename}")
137
+ return True
138
+
132
139
  if not path.create(file.path(local_path)):
133
140
  return False
134
141
 
@@ -160,6 +167,7 @@ class S3Interface(StorageInterface):
160
167
  object_name=object_name,
161
168
  filename=filename,
162
169
  log=log,
170
+ policy=policy,
163
171
  )
164
172
 
165
173
  success, list_of_files = self.ls(
@@ -174,6 +182,7 @@ class S3Interface(StorageInterface):
174
182
  object_name=object_name,
175
183
  filename=filename_,
176
184
  log=log,
185
+ policy=policy,
177
186
  ):
178
187
  return False
179
188
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bluer_objects
3
- Version: 6.223.1
3
+ Version: 6.231.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.223.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.231.1`](https://github.com/kamangir/bluer-objects).
68
68
 
69
69
  built by 🌀 [`blueness-3.118.1`](https://github.com/kamangir/blueness).
@@ -85,6 +85,7 @@ bluer_objects/.abcli/web/where_am_i.sh
85
85
  bluer_objects/README/__init__.py
86
86
  bluer_objects/README/functions.py
87
87
  bluer_objects/README/items.py
88
+ bluer_objects/README/utils.py
88
89
  bluer_objects/file/__init__.py
89
90
  bluer_objects/file/__main__.py
90
91
  bluer_objects/file/classes.py
@@ -143,6 +144,7 @@ bluer_objects/storage/WebDAVzip.py
143
144
  bluer_objects/storage/__init__.py
144
145
  bluer_objects/storage/__main__.py
145
146
  bluer_objects/storage/base.py
147
+ bluer_objects/storage/policies.py
146
148
  bluer_objects/storage/s3.py
147
149
  bluer_objects/testing/__init__.py
148
150
  bluer_objects/testing/__main__.py