splent-cli 1.29.1__tar.gz → 1.30.0__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.
- {splent_cli-1.29.1/src/splent_cli.egg-info → splent_cli-1.30.0}/PKG-INFO +1 -1
- {splent_cli-1.29.1 → splent_cli-1.30.0}/pyproject.toml +1 -1
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/spl/spl_publish.py +145 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/services/marketplace_api.py +31 -3
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/utils/io_utils.py +10 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0/src/splent_cli.egg-info}/PKG-INFO +1 -1
- {splent_cli-1.29.1 → splent_cli-1.30.0}/LICENSE +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/README.md +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/setup.cfg +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/__init__.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/__main__.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/cli.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/__init__.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/cache/__init__.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/cache/cache_clear.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/cache/cache_orphans.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/cache/cache_outdated.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/cache/cache_prune.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/cache/cache_size.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/cache/cache_status.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/cache/cache_usage.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/cache/cache_versions.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/check/__init__.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/check/check_contracts.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/check/check_deps.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/check/check_docker.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/check/check_env.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/check/check_features.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/check/check_github.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/check/check_infra.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/check/check_product.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/check/check_pypi.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/check/check_pyproject.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/check/check_releases.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/clear/__init__.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/clear/clear_build.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/clear/clear_log.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/clear/clear_uploads.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/command/__init__.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/command/command_create.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/coverage.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/database/db_console.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/database/db_dump.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/database/db_migrate.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/database/db_reset.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/database/db_restore.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/database/db_rollback.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/database/db_seed.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/database/db_status.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/database/db_upgrade.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/doctor.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/env/env_list.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/env/env_set.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/env/env_show.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/export/__init__.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/export/export_puml.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_add.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_attach.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_clean.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_clone.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_compat.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_compile.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_contract.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_create.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_delete.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_detach.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_discard.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_drift.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_env.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_fork.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_git.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_hook_add.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_hook_remove.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_hooks.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_impact.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_info.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_inject_config.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_install.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_list.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_order.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_outdated.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_pin.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_pip_install.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_pull.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_refine.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_release.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_remove.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_rename.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_search.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_status.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_sync_template.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_test.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_translate.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_unlock.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_upgrade.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_versions.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_xray.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/lint.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/locust.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/marketplace/login.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/marketplace/logout.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/marketplace/marketplace_auth_utils.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/marketplace/marketplace_index.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/marketplace/whoami.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/product/__init__.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/product/product_auto_require.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/product/product_build.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/product/product_clean.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/product/product_commands.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/product/product_config.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/product/product_configure.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/product/product_console.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/product/product_containers.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/product/product_create.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/product/product_deploy.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/product/product_derive.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/product/product_deselect.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/product/product_down.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/product/product_drift.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/product/product_env.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/product/product_list.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/product/product_logs.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/product/product_missing.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/product/product_port.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/product/product_release.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/product/product_resolve.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/product/product_restart.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/product/product_routes.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/product/product_run.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/product/product_select.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/product/product_shell.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/product/product_signals.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/product/product_sync_template.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/product/product_test.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/product/product_up.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/product/product_validate.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/release/__init__.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/release/release_core.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/release/release_resume.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/selenium.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/spl/__init__.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/spl/spl_add_constraints.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/spl/spl_add_feature.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/spl/spl_compare.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/spl/spl_configurations.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/spl/spl_create.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/spl/spl_deps.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/spl/spl_features.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/spl/spl_fetch.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/spl/spl_info.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/spl/spl_list.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/spl/spl_outdated.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/spl/spl_pin.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/spl/spl_remove_feature.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/spl/spl_utils.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/tokens_setup.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/uvl/uvl_utils.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/version.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/services/__init__.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/services/compose.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/services/context.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/services/credentials.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/services/image_registry.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/services/index_refresh.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/services/marketplace.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/services/marketplace_url.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/services/preflight.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/services/pypi_quota.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/services/registry.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/services/release.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/services/release_dry_run.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/services/release_gate.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/services/spl_store.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/utils/__init__.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/utils/archetype.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/utils/cache_utils.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/utils/command_loader.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/utils/contract_freshness.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/utils/db_client.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/utils/db_utils.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/utils/decorators.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/utils/dynamic_imports.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/utils/feature_installer.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/utils/feature_utils.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/utils/forge.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/utils/git_url.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/utils/integrity.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/utils/lifecycle.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/utils/manifest.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/utils/path_utils.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/utils/proc.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/utils/redact.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/utils/refinement_facts.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/utils/template_drift.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/utils/toml_edit.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/utils/upgrade_plan.py +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli.egg-info/SOURCES.txt +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli.egg-info/dependency_links.txt +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli.egg-info/entry_points.txt +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli.egg-info/requires.txt +0 -0
- {splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: splent_cli
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.30.0
|
|
4
4
|
Summary: SPLENT-CLI is a CLI to be able to work on your development more easily.
|
|
5
5
|
Author-email: DiversoLab <diversolab@us.es>
|
|
6
6
|
Project-URL: Homepage, https://github.com/diverso-lab/splent_cli
|
|
@@ -21,6 +21,7 @@ saying what came back.
|
|
|
21
21
|
|
|
22
22
|
import os
|
|
23
23
|
import re
|
|
24
|
+
import time
|
|
24
25
|
import tomllib
|
|
25
26
|
|
|
26
27
|
import click
|
|
@@ -225,6 +226,119 @@ def _concept_doi(result: dict) -> str:
|
|
|
225
226
|
return ""
|
|
226
227
|
|
|
227
228
|
|
|
229
|
+
# ---------------------------------------------------------------------------
|
|
230
|
+
# Waiting for the DOI
|
|
231
|
+
# ---------------------------------------------------------------------------
|
|
232
|
+
|
|
233
|
+
#: Seconds between two questions about a release that is still being minted.
|
|
234
|
+
POLL_INTERVAL = 5
|
|
235
|
+
#: How long to keep asking about a release that is still being minted. Longer
|
|
236
|
+
#: than the marketplace waits on a mint before it goes looking for the DOI.
|
|
237
|
+
WAIT_LIMIT = 20 * 60
|
|
238
|
+
#: How long to keep asking once the marketplace says it lost track of the
|
|
239
|
+
#: mint. It looks for the DOI about once a minute, so this is a few looks.
|
|
240
|
+
UNKNOWN_GRACE = 5 * 60
|
|
241
|
+
#: How often to say it is still going, so a quiet terminal does not read as
|
|
242
|
+
#: a hung one.
|
|
243
|
+
PROGRESS_EVERY = 30
|
|
244
|
+
|
|
245
|
+
#: Error codes that waiting longer cannot fix.
|
|
246
|
+
_FINAL_CODES = frozenset(
|
|
247
|
+
{
|
|
248
|
+
marketplace_api.CODE_FORBIDDEN,
|
|
249
|
+
marketplace_api.CODE_NOT_FOUND,
|
|
250
|
+
marketplace_api.CODE_INVALID_REQUEST,
|
|
251
|
+
}
|
|
252
|
+
)
|
|
253
|
+
|
|
254
|
+
# Swapped out by the tests, so nothing there really waits.
|
|
255
|
+
_sleep = time.sleep
|
|
256
|
+
_clock = time.monotonic
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
def _duration(seconds: float) -> str:
|
|
260
|
+
minutes, rest = divmod(int(seconds), 60)
|
|
261
|
+
return f"{minutes}m {rest:02d}s" if minutes else f"{rest}s"
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
def _wait_for_release(client, spl_name: str, accepted: dict) -> dict:
|
|
265
|
+
"""Ask about an accepted release until the marketplace settles it.
|
|
266
|
+
|
|
267
|
+
Returns the last answer: published or failed, or still reserved or
|
|
268
|
+
unknown once the limits above run out. Nothing is written down until it
|
|
269
|
+
says published, so stopping early, by limit or by Ctrl+C, loses nothing.
|
|
270
|
+
"""
|
|
271
|
+
version = accepted.get("version")
|
|
272
|
+
if not version:
|
|
273
|
+
raise marketplace_api.MarketplaceError(
|
|
274
|
+
"The marketplace accepted the release but did not say which version it is.",
|
|
275
|
+
status=None,
|
|
276
|
+
code=marketplace_api.CODE_BAD_RESPONSE,
|
|
277
|
+
)
|
|
278
|
+
click.echo(
|
|
279
|
+
f" Release {version} accepted. Minting its DOI, which usually takes a "
|
|
280
|
+
"minute or two."
|
|
281
|
+
)
|
|
282
|
+
|
|
283
|
+
started = last_report = _clock()
|
|
284
|
+
unknown_since = None
|
|
285
|
+
status = accepted
|
|
286
|
+
warned = False
|
|
287
|
+
while True:
|
|
288
|
+
state = str(status.get("state") or "")
|
|
289
|
+
if state not in ("reserved", "unknown"):
|
|
290
|
+
return status
|
|
291
|
+
now = _clock()
|
|
292
|
+
if state == "unknown" and unknown_since is None:
|
|
293
|
+
unknown_since = now
|
|
294
|
+
if now - started >= WAIT_LIMIT or (
|
|
295
|
+
unknown_since is not None and now - unknown_since >= UNKNOWN_GRACE
|
|
296
|
+
):
|
|
297
|
+
return status
|
|
298
|
+
if now - last_report >= PROGRESS_EVERY:
|
|
299
|
+
click.echo(f" Still minting ({_duration(now - started)}).")
|
|
300
|
+
last_report = now
|
|
301
|
+
_sleep(POLL_INTERVAL)
|
|
302
|
+
try:
|
|
303
|
+
status = client.release_status(spl_name, version)
|
|
304
|
+
except marketplace_api.MarketplaceError as e:
|
|
305
|
+
if e.dead_token or e.code in _FINAL_CODES:
|
|
306
|
+
raise
|
|
307
|
+
# A blip between two questions says nothing about the release,
|
|
308
|
+
# which carries on in the marketplace either way.
|
|
309
|
+
if not warned:
|
|
310
|
+
click.secho(
|
|
311
|
+
f" The marketplace did not answer ({e.reason or e}). "
|
|
312
|
+
"Asking again.",
|
|
313
|
+
fg="yellow",
|
|
314
|
+
)
|
|
315
|
+
warned = True
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
def _come_back_later(spl_name: str, version, state: str) -> None:
|
|
319
|
+
"""What to do about a release that has not settled yet. Always exits."""
|
|
320
|
+
click.echo()
|
|
321
|
+
if state == "unknown":
|
|
322
|
+
click.secho(
|
|
323
|
+
f" Release {version} did not report back, so the marketplace is "
|
|
324
|
+
"looking for its DOI.",
|
|
325
|
+
fg="yellow",
|
|
326
|
+
)
|
|
327
|
+
else:
|
|
328
|
+
click.secho(
|
|
329
|
+
f" Release {version} is still being minted. The marketplace carries "
|
|
330
|
+
"on with it.",
|
|
331
|
+
fg="yellow",
|
|
332
|
+
)
|
|
333
|
+
click.echo(
|
|
334
|
+
f" Run splent spl:publish {spl_name} again later. The same model is "
|
|
335
|
+
"answered with its DOI once it exists, and is never minted twice."
|
|
336
|
+
)
|
|
337
|
+
click.echo(" Nothing was written down locally yet.")
|
|
338
|
+
click.echo()
|
|
339
|
+
raise SystemExit(1)
|
|
340
|
+
|
|
341
|
+
|
|
228
342
|
# ---------------------------------------------------------------------------
|
|
229
343
|
# Command
|
|
230
344
|
# ---------------------------------------------------------------------------
|
|
@@ -315,6 +429,7 @@ def spl_publish(spl_name, registry_option, dry_run):
|
|
|
315
429
|
click.echo()
|
|
316
430
|
click.echo(" Would POST the model to /api/v1/spls/<name>/releases and:")
|
|
317
431
|
click.echo(" - let the marketplace publish or version it on its own key")
|
|
432
|
+
click.echo(" - wait while it mints the DOI")
|
|
318
433
|
click.echo(" - let it verify the published file byte for byte")
|
|
319
434
|
click.echo(" - record the DOI it reports")
|
|
320
435
|
if metadata_path:
|
|
@@ -360,6 +475,36 @@ def spl_publish(spl_name, registry_option, dry_run):
|
|
|
360
475
|
click.echo()
|
|
361
476
|
raise SystemExit(1)
|
|
362
477
|
|
|
478
|
+
if result.get("accepted"):
|
|
479
|
+
try:
|
|
480
|
+
result = _wait_for_release(client, spl_name, result)
|
|
481
|
+
except marketplace_api.MarketplaceError as e:
|
|
482
|
+
handle_error(e, url=target.url, forget=not cred.from_environment)
|
|
483
|
+
click.echo()
|
|
484
|
+
raise SystemExit(1)
|
|
485
|
+
except KeyboardInterrupt:
|
|
486
|
+
click.echo()
|
|
487
|
+
click.secho(" Stopped waiting.", fg="yellow")
|
|
488
|
+
click.echo(
|
|
489
|
+
f" The marketplace carries on with release {result.get('version')}. "
|
|
490
|
+
f"Run splent spl:publish {spl_name} again to pick up its DOI."
|
|
491
|
+
)
|
|
492
|
+
raise SystemExit(130)
|
|
493
|
+
state = str(result.get("state") or "")
|
|
494
|
+
if state == "failed":
|
|
495
|
+
click.secho(
|
|
496
|
+
f" Release {result.get('version')} was refused. Nothing was minted.",
|
|
497
|
+
fg="red",
|
|
498
|
+
)
|
|
499
|
+
detail = str(result.get("detail") or "").strip()
|
|
500
|
+
if detail:
|
|
501
|
+
click.echo(f" {detail}")
|
|
502
|
+
click.echo(" Fix the model and publish it again.")
|
|
503
|
+
click.echo()
|
|
504
|
+
raise SystemExit(1)
|
|
505
|
+
if state != "published":
|
|
506
|
+
_come_back_later(spl_name, result.get("version"), state)
|
|
507
|
+
|
|
363
508
|
doi, remote_file = _pointer(result)
|
|
364
509
|
concept_doi = _concept_doi(result)
|
|
365
510
|
if not doi:
|
|
@@ -17,6 +17,10 @@ extra fields and loud about missing ones)::
|
|
|
17
17
|
GET /api/v1/spls public
|
|
18
18
|
GET /api/v1/spls/<name> public -> {name, description, uvl{...}}
|
|
19
19
|
POST /api/v1/spls/<name>/releases Bearer, multipart with the uvl file
|
|
20
|
+
Prefer: respond-async -> 202 {accepted,
|
|
21
|
+
version, state} while the DOI is minted
|
|
22
|
+
GET /api/v1/spls/<name>/releases/<version>
|
|
23
|
+
Bearer -> {state, doi, uvl{...}, ...}
|
|
20
24
|
|
|
21
25
|
Nothing here prints, and nothing here ever puts a token in a message: an error
|
|
22
26
|
string from this module is safe to show to the user verbatim.
|
|
@@ -36,6 +40,11 @@ USER_AGENT = "splent-cli"
|
|
|
36
40
|
DEFAULT_TIMEOUT = 15
|
|
37
41
|
UPLOAD_TIMEOUT = 60
|
|
38
42
|
|
|
43
|
+
#: RFC 7240. Asks the marketplace to answer a release as soon as it is
|
|
44
|
+
#: reserved and mint the DOI in the background. A marketplace that predates
|
|
45
|
+
#: it ignores the header and answers when the DOI exists, as it always did.
|
|
46
|
+
PREFER_ASYNC = "respond-async"
|
|
47
|
+
|
|
39
48
|
#: Lifetime requested for a token created by ``splent login``.
|
|
40
49
|
DEFAULT_TTL_DAYS = 90
|
|
41
50
|
|
|
@@ -451,6 +460,7 @@ class MarketplaceClient:
|
|
|
451
460
|
timeout: int | None = None,
|
|
452
461
|
unauthenticated_code: str | None = None,
|
|
453
462
|
sent_but_unanswered: str | None = None,
|
|
463
|
+
extra_headers: dict | None = None,
|
|
454
464
|
):
|
|
455
465
|
"""Perform the request. Returns parsed JSON, or None for an empty body.
|
|
456
466
|
|
|
@@ -465,7 +475,7 @@ class MarketplaceClient:
|
|
|
465
475
|
response = requests.request(
|
|
466
476
|
method,
|
|
467
477
|
url,
|
|
468
|
-
headers=self._headers(auth=auth),
|
|
478
|
+
headers={**self._headers(auth=auth), **(extra_headers or {})},
|
|
469
479
|
json=json_body,
|
|
470
480
|
files=files,
|
|
471
481
|
data=data,
|
|
@@ -637,6 +647,10 @@ class MarketplaceClient:
|
|
|
637
647
|
spends anything: on the far side the marketplace relays it to UVLHub
|
|
638
648
|
with its own key and a DOI may be minted. ``splent spl:publish`` is its
|
|
639
649
|
only caller and there is meant to be exactly one.
|
|
650
|
+
|
|
651
|
+
It asks for the answer as soon as the release is reserved. A body with
|
|
652
|
+
``accepted`` set means the DOI is still being minted, and
|
|
653
|
+
:meth:`release_status` says how it ends.
|
|
640
654
|
"""
|
|
641
655
|
files = {
|
|
642
656
|
UVL_FIELD_NAME: (filename, uvl_bytes, "text/plain"),
|
|
@@ -651,10 +665,24 @@ class MarketplaceClient:
|
|
|
651
665
|
sent_but_unanswered=(
|
|
652
666
|
f"The upload of {name} was sent to the marketplace at {self.base_url} "
|
|
653
667
|
f"but no answer came back within {UPLOAD_TIMEOUT} seconds. The "
|
|
654
|
-
"release may have completed
|
|
655
|
-
"
|
|
668
|
+
"release may have completed. Publishing the same model again is "
|
|
669
|
+
"safe. The marketplace answers it with the DOI it minted and "
|
|
670
|
+
"never mints a second one."
|
|
656
671
|
),
|
|
672
|
+
extra_headers={"Prefer": PREFER_ASYNC},
|
|
657
673
|
)
|
|
658
674
|
if payload is None:
|
|
659
675
|
return {}
|
|
660
676
|
return self._expect_dict(payload, "release response")
|
|
677
|
+
|
|
678
|
+
def release_status(self, name: str, version) -> dict:
|
|
679
|
+
"""How one release of *name* stands: reserved, published, failed or unknown.
|
|
680
|
+
|
|
681
|
+
The path is built here from the name and the version, never taken from
|
|
682
|
+
the server's ``status_url``: the token goes with this request, and it
|
|
683
|
+
only ever goes to the marketplace it was issued by.
|
|
684
|
+
"""
|
|
685
|
+
payload = self._request(
|
|
686
|
+
"GET", f"/api/v1/spls/{name}/releases/{int(version)}", auth=True
|
|
687
|
+
)
|
|
688
|
+
return self._expect_dict(payload, "release status")
|
|
@@ -248,6 +248,11 @@ def give_tree_to_its_owner(
|
|
|
248
248
|
pass
|
|
249
249
|
|
|
250
250
|
|
|
251
|
+
# Characters a shell sourcing a .env reads as syntax rather than as part of a
|
|
252
|
+
# bare value. Double quotes make every one of them literal.
|
|
253
|
+
_SHELL_SYNTAX = frozenset("<>|&;()")
|
|
254
|
+
|
|
255
|
+
|
|
251
256
|
def env_line(key: str, value: str) -> str:
|
|
252
257
|
"""One ``KEY=value`` line for a generated .env file.
|
|
253
258
|
|
|
@@ -258,12 +263,17 @@ def env_line(key: str, value: str) -> str:
|
|
|
258
263
|
files do not churn. A value that starts or ends with a quote is quoted
|
|
259
264
|
too, or a reader would take its own quotes for the file's.
|
|
260
265
|
|
|
266
|
+
So is a value with a character the shell reads as syntax. ``product:restart``
|
|
267
|
+
sources the file with bash, and a bare ``AUTODEPLOY_SECRET=<SET>`` is a
|
|
268
|
+
redirection there: the source fails, and the app never starts.
|
|
269
|
+
|
|
261
270
|
Inside the quotes backslashes are escaped before double quotes, so
|
|
262
271
|
:func:`parse_env_value` (and dotenv) give back exactly ``value``.
|
|
263
272
|
"""
|
|
264
273
|
if (
|
|
265
274
|
any(c.isspace() for c in value)
|
|
266
275
|
or "#" in value
|
|
276
|
+
or any(c in _SHELL_SYNTAX for c in value)
|
|
267
277
|
or value[:1] in ("'", '"')
|
|
268
278
|
or value[-1:] in ("'", '"')
|
|
269
279
|
):
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: splent_cli
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.30.0
|
|
4
4
|
Summary: SPLENT-CLI is a CLI to be able to work on your development more easily.
|
|
5
5
|
Author-email: DiversoLab <diversolab@us.es>
|
|
6
6
|
Project-URL: Homepage, https://github.com/diverso-lab/splent_cli
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_hook_remove.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_inject_config.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_pip_install.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_sync_template.py
RENAMED
|
File without changes
|
|
File without changes
|
{splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/feature/feature_translate.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/marketplace/marketplace_index.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/product/product_auto_require.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/product/product_configure.py
RENAMED
|
File without changes
|
|
File without changes
|
{splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/product/product_containers.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{splent_cli-1.29.1 → splent_cli-1.30.0}/src/splent_cli/commands/product/product_sync_template.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|