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.
- {bluer_objects-6.223.1/bluer_objects.egg-info → bluer_objects-6.231.1}/PKG-INFO +2 -2
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/README.md +1 -1
- bluer_objects-6.231.1/bluer_objects/README/functions.py +186 -0
- bluer_objects-6.231.1/bluer_objects/README/utils.py +235 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/__init__.py +1 -1
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/storage/WebDAV.py +3 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/storage/WebDAVrequest.py +4 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/storage/WebDAVzip.py +5 -2
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/storage/__init__.py +3 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/storage/base.py +8 -1
- bluer_objects-6.231.1/bluer_objects/storage/policies.py +7 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/storage/s3.py +9 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1/bluer_objects.egg-info}/PKG-INFO +2 -2
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects.egg-info/SOURCES.txt +2 -0
- bluer_objects-6.223.1/bluer_objects/README/functions.py +0 -297
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/LICENSE +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/MANIFEST.in +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/abcli.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/actions.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/aka.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/alias.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/bluer_objects.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/clone.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/create_test_asset.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/download.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/file.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/gif.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/host.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/ls.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/metadata/get.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/metadata/post.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/metadata.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/mlflow/browse.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/mlflow/cache.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/mlflow/deploy.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/mlflow/list_registered_models.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/mlflow/lock/lock.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/mlflow/lock/unlock.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/mlflow/lock.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/mlflow/log_artifacts.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/mlflow/log_run.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/mlflow/run.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/mlflow/tags/clone.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/mlflow/tags/get.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/mlflow/tags/search.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/mlflow/tags/set.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/mlflow/tags.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/mlflow/test.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/mlflow/transition.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/mlflow.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/object.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/select.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/storage/clear.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/storage/download_file.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/storage/exists.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/storage/list.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/storage/rm.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/storage/status.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/storage.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/tests/README.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/tests/clone.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/tests/create_test_asset.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/tests/gif.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/tests/help.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/tests/host.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/tests/ls.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/tests/metadata.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/tests/mlflow_cache.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/tests/mlflow_lock.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/tests/mlflow_logging.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/tests/mlflow_tags.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/tests/mlflow_test.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/tests/storage_public_upload.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/tests/storage_upload_download.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/tests/version.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/tests/web_is_accessible.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/tests/web_where_am_ai.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/upload.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/url.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/web/is_accessible.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/.abcli/web/where_am_i.sh +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/README/__init__.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/README/items.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/__main__.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/config.env +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/env.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/file/__init__.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/file/__main__.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/file/classes.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/file/functions.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/file/load.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/file/save.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/graphics/__init__.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/graphics/__main__.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/graphics/frame.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/graphics/gif.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/graphics/screen.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/graphics/signature.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/graphics/text.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/help/__init__.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/help/__main__.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/help/clone.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/help/create_test_asset.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/help/download.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/help/functions.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/help/gif.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/help/host.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/help/ls.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/help/metadata.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/help/mlflow/__init__.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/help/mlflow/cache.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/help/mlflow/lock.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/help/mlflow/tags.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/help/upload.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/help/web.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/host/__init__.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/host/__main__.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/host/functions.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/logger/__init__.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/logger/image.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/logger/matrix.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/markdown.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/metadata/__init__.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/metadata/__main__.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/metadata/enums.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/metadata/get.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/metadata/post.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/mlflow/__init__.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/mlflow/__main__.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/mlflow/cache.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/mlflow/lock/__init__.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/mlflow/lock/__main__.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/mlflow/lock/functions.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/mlflow/logging.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/mlflow/models.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/mlflow/objects.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/mlflow/runs.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/mlflow/tags.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/mlflow/testing.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/objects.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/path.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/sample.env +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/storage/__main__.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/testing/__init__.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/testing/__main__.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/testing/functions.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/__init__.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_README.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_env.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_file_download.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_file_load_save.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_file_load_save_text.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_fullname.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_graphics.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_graphics_frame.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_graphics_gif.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_graphics_screen.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_graphics_signature.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_graphics_text.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_log_image_grid.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_logger.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_logger_matrix.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_markdown.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_metadata.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_mlflow.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_mlflow_lock.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_objects.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_path.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_storage.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_storage_base.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_storage_s3.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_storage_webdav_request.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_storage_webdav_zip.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_testing.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_version.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/tests/test_web_is_accessible.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/urls.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/web/__init__.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/web/__main__.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects/web/functions.py +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects.egg-info/dependency_links.txt +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects.egg-info/requires.txt +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/bluer_objects.egg-info/top_level.txt +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/pyproject.toml +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/requirements.txt +0 -0
- {bluer_objects-6.223.1 → bluer_objects-6.231.1}/setup.cfg +0 -0
- {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.
|
|
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
|
[](https://github.com/kamangir/bluer-objects/actions/workflows/pylint.yml) [](https://github.com/kamangir/bluer-objects/actions/workflows/pytest.yml) [](https://github.com/kamangir/bluer-objects/actions/workflows/bashtest.yml) [](https://pypi.org/project/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.
|
|
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
|
[](https://github.com/kamangir/bluer-objects/actions/workflows/pylint.yml) [](https://github.com/kamangir/bluer-objects/actions/workflows/pytest.yml) [](https://github.com/kamangir/bluer-objects/actions/workflows/bashtest.yml) [](https://pypi.org/project/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.
|
|
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
|
+
"".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("<", "<")
|
|
172
|
+
.replace(">", ">")
|
|
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"[](https://github.com/kamangir/{REPO_NAME}/actions/workflows/pylint.yml)",
|
|
219
|
+
f"[](https://github.com/kamangir/{REPO_NAME}/actions/workflows/pytest.yml)",
|
|
220
|
+
f"[](https://github.com/kamangir/{REPO_NAME}/actions/workflows/bashtest.yml)",
|
|
221
|
+
f"[](https://pypi.org/project/{MODULE_NAME}/)",
|
|
222
|
+
f"[](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,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
|
|
8
|
+
from bluer_objects import env
|
|
9
9
|
from bluer_objects import objects
|
|
10
|
-
from bluer_objects.host import
|
|
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
|
|
|
@@ -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.
|
|
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
|
[](https://github.com/kamangir/bluer-objects/actions/workflows/pylint.yml) [](https://github.com/kamangir/bluer-objects/actions/workflows/pytest.yml) [](https://github.com/kamangir/bluer-objects/actions/workflows/bashtest.yml) [](https://pypi.org/project/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.
|
|
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
|