splent-cli 1.31.0__tar.gz → 1.32.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.31.0/src/splent_cli.egg-info → splent_cli-1.32.0}/PKG-INFO +1 -1
- {splent_cli-1.31.0 → splent_cli-1.32.0}/pyproject.toml +1 -1
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_build.py +97 -2
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_release.py +25 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0/src/splent_cli.egg-info}/PKG-INFO +1 -1
- {splent_cli-1.31.0 → splent_cli-1.32.0}/LICENSE +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/README.md +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/setup.cfg +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/__init__.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/__main__.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/cli.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/__init__.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/cache/__init__.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/cache/cache_clear.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/cache/cache_orphans.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/cache/cache_outdated.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/cache/cache_prune.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/cache/cache_size.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/cache/cache_status.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/cache/cache_usage.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/cache/cache_versions.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/check/__init__.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/check/check_contracts.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/check/check_deps.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/check/check_docker.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/check/check_env.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/check/check_features.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/check/check_github.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/check/check_infra.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/check/check_product.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/check/check_pypi.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/check/check_pyproject.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/check/check_releases.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/clear/__init__.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/clear/clear_build.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/clear/clear_log.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/clear/clear_uploads.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/command/__init__.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/command/command_create.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/coverage.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/database/db_console.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/database/db_dump.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/database/db_migrate.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/database/db_reset.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/database/db_restore.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/database/db_rollback.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/database/db_seed.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/database/db_status.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/database/db_upgrade.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/doctor.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/env/env_list.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/env/env_set.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/env/env_show.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/export/__init__.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/export/export_puml.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_add.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_attach.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_clean.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_clone.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_compat.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_compile.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_contract.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_create.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_delete.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_detach.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_discard.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_drift.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_env.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_fork.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_git.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_hook_add.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_hook_remove.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_hooks.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_impact.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_info.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_inject_config.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_install.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_list.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_order.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_outdated.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_pin.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_pip_install.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_pull.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_refine.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_release.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_remove.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_rename.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_search.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_status.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_sync_template.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_test.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_translate.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_unlock.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_upgrade.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_versions.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_xray.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/lint.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/locust.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/marketplace/login.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/marketplace/logout.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/marketplace/marketplace_auth_utils.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/marketplace/marketplace_index.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/marketplace/whoami.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/__init__.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_auto_require.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_clean.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_commands.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_config.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_configure.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_console.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_containers.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_create.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_deploy.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_derive.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_deselect.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_down.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_drift.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_env.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_list.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_logs.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_missing.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_port.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_resolve.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_restart.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_routes.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_run.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_select.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_shell.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_signals.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_sync_template.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_test.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_up.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_validate.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/release/__init__.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/release/release_core.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/release/release_resume.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/selenium.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/spl/__init__.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/spl/spl_add_constraints.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/spl/spl_add_feature.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/spl/spl_compare.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/spl/spl_configurations.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/spl/spl_create.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/spl/spl_deps.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/spl/spl_features.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/spl/spl_fetch.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/spl/spl_info.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/spl/spl_list.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/spl/spl_outdated.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/spl/spl_pin.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/spl/spl_publish.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/spl/spl_remove_feature.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/spl/spl_utils.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/tokens_setup.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/uvl/uvl_utils.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/version.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/services/__init__.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/services/compose.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/services/context.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/services/credentials.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/services/deploy_bundle.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/services/image_registry.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/services/index_refresh.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/services/marketplace.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/services/marketplace_api.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/services/marketplace_url.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/services/preflight.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/services/pypi_quota.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/services/registry.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/services/release.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/services/release_dry_run.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/services/release_gate.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/services/spl_store.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/__init__.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/archetype.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/cache_utils.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/command_loader.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/contract_freshness.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/db_client.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/db_utils.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/decorators.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/dynamic_imports.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/feature_installer.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/feature_utils.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/forge.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/git_url.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/integrity.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/io_utils.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/lifecycle.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/manifest.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/path_utils.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/proc.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/redact.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/refinement_facts.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/template_drift.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/toml_edit.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/upgrade_plan.py +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli.egg-info/SOURCES.txt +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli.egg-info/dependency_links.txt +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli.egg-info/entry_points.txt +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli.egg-info/requires.txt +0 -0
- {splent_cli-1.31.0 → splent_cli-1.32.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.32.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
|
|
@@ -45,6 +45,17 @@ CONTRACTS_FORMAT = 1
|
|
|
45
45
|
REQUIREMENTS_FILE = "requirements.prod.txt"
|
|
46
46
|
GUNICORN_REQUIREMENT = "gunicorn>=23,<24"
|
|
47
47
|
|
|
48
|
+
# Every third-party package the production image installs, at the version the
|
|
49
|
+
# last build resolved, read back from the image with pip freeze. The
|
|
50
|
+
# Dockerfile applies it as a constraint on every pip install, so two builds of
|
|
51
|
+
# one commit install the same set. Versioned beside requirements.prod.txt.
|
|
52
|
+
LOCK_FILE = "requirements.lock"
|
|
53
|
+
LOCK_HEADER = (
|
|
54
|
+
"# Every third-party package the production image installs, at the version\n"
|
|
55
|
+
"# the last build resolved. Written by splent product:build and\n"
|
|
56
|
+
"# product:release from the image itself. Do not edit it.\n"
|
|
57
|
+
)
|
|
58
|
+
|
|
48
59
|
# Database settings every product names the same way. A template writes <SET>
|
|
49
60
|
# for them, and the CLI fills them in rather than ask: nobody needs to choose
|
|
50
61
|
# what the database is called.
|
|
@@ -424,6 +435,75 @@ def runtime_requirements(workspace: str) -> str:
|
|
|
424
435
|
)
|
|
425
436
|
|
|
426
437
|
|
|
438
|
+
def _canonical(name: str) -> str:
|
|
439
|
+
import re
|
|
440
|
+
|
|
441
|
+
return re.sub(r"[-_.]+", "-", name).lower()
|
|
442
|
+
|
|
443
|
+
|
|
444
|
+
def lock_text(freeze_output: str, product: str) -> str:
|
|
445
|
+
"""docker/requirements.lock from what pip freeze reports in the image.
|
|
446
|
+
|
|
447
|
+
SPLENT's own packages (the framework, the CLI, every feature) and the
|
|
448
|
+
product are left out: their versions are pinned where they are chosen, in
|
|
449
|
+
requirements.prod.txt and pyproject.toml, and a feature installed from its
|
|
450
|
+
git tag is not something a constraints file can name.
|
|
451
|
+
"""
|
|
452
|
+
product_name = _canonical(product)
|
|
453
|
+
kept = []
|
|
454
|
+
for line in freeze_output.splitlines():
|
|
455
|
+
line = line.strip()
|
|
456
|
+
if not line or line.startswith(("#", "-")) or " @ " in line or "==" not in line:
|
|
457
|
+
continue
|
|
458
|
+
name = _canonical(line.split("==", 1)[0])
|
|
459
|
+
if name.startswith("splent") or name == product_name:
|
|
460
|
+
continue
|
|
461
|
+
kept.append(line)
|
|
462
|
+
return LOCK_HEADER + "".join(f"{line}\n" for line in sorted(kept, key=str.lower))
|
|
463
|
+
|
|
464
|
+
|
|
465
|
+
def ensure_lock(docker_path: str) -> str:
|
|
466
|
+
"""The lock's path, written with no pin yet when the product has none."""
|
|
467
|
+
path = os.path.join(docker_path, LOCK_FILE)
|
|
468
|
+
if not os.path.isfile(path):
|
|
469
|
+
atomic_write(path, LOCK_HEADER, dir_owner=True)
|
|
470
|
+
return path
|
|
471
|
+
|
|
472
|
+
|
|
473
|
+
def write_lock_from_image(image: str, product: str, docker_path: str) -> int:
|
|
474
|
+
"""Pin in docker/requirements.lock what ``image`` installed. Returns how many."""
|
|
475
|
+
frozen = subprocess.run(
|
|
476
|
+
["docker", "run", "--rm", "--entrypoint", "pip", image, "freeze"],
|
|
477
|
+
capture_output=True,
|
|
478
|
+
text=True,
|
|
479
|
+
check=True,
|
|
480
|
+
).stdout
|
|
481
|
+
text = lock_text(frozen, product)
|
|
482
|
+
atomic_write(os.path.join(docker_path, LOCK_FILE), text, dir_owner=True)
|
|
483
|
+
return sum(1 for line in text.splitlines() if line and not line.startswith("#"))
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
def resolve_lock(product: str, workspace: str, docker_path: str) -> int:
|
|
487
|
+
"""Resolve the third-party packages afresh and pin them in the lock.
|
|
488
|
+
|
|
489
|
+
Builds the image's build stage with SPLENT_FRESH_LOCK=1, which leaves the
|
|
490
|
+
current lock out, and reads back what it installed. product:release runs
|
|
491
|
+
this before its commit, so the lock it commits is what its image installs.
|
|
492
|
+
"""
|
|
493
|
+
tag = f"{product}:lock"
|
|
494
|
+
subprocess.run(
|
|
495
|
+
production_image_build_command(
|
|
496
|
+
product,
|
|
497
|
+
workspace,
|
|
498
|
+
docker_path,
|
|
499
|
+
[tag],
|
|
500
|
+
extra=("--target", "builder", "--build-arg", "SPLENT_FRESH_LOCK=1"),
|
|
501
|
+
),
|
|
502
|
+
check=True,
|
|
503
|
+
)
|
|
504
|
+
return write_lock_from_image(tag, product, docker_path)
|
|
505
|
+
|
|
506
|
+
|
|
427
507
|
def pypi_serves(package: str, version: str) -> bool | None:
|
|
428
508
|
"""Whether PyPI serves ``package==version``. None when it could not be asked."""
|
|
429
509
|
import requests
|
|
@@ -470,6 +550,7 @@ def production_image_build_command(
|
|
|
470
550
|
docker_path: str,
|
|
471
551
|
tags: Sequence[str],
|
|
472
552
|
context: str | None = None,
|
|
553
|
+
extra: Sequence[str] = (),
|
|
473
554
|
) -> list[str]:
|
|
474
555
|
"""The ``docker build`` that produces the product's production image.
|
|
475
556
|
|
|
@@ -489,6 +570,7 @@ def production_image_build_command(
|
|
|
489
570
|
for tag in tags:
|
|
490
571
|
cmd += ["-t", tag]
|
|
491
572
|
cmd += forge_build_args()
|
|
573
|
+
cmd += list(extra)
|
|
492
574
|
cmd += ["-f", dockerfile, context]
|
|
493
575
|
return cmd
|
|
494
576
|
|
|
@@ -526,6 +608,7 @@ def build_production_image(
|
|
|
526
608
|
*,
|
|
527
609
|
stage_model: bool = True,
|
|
528
610
|
committed: bool = False,
|
|
611
|
+
fresh_lock: bool = False,
|
|
529
612
|
) -> None:
|
|
530
613
|
"""Build the production image under ``tags``.
|
|
531
614
|
|
|
@@ -547,9 +630,12 @@ def build_production_image(
|
|
|
547
630
|
staged = stage_spl_model(workspace, product, docker_path)
|
|
548
631
|
if staged:
|
|
549
632
|
click.echo(f" Staged the UVL model: {staged}")
|
|
633
|
+
extra = ("--build-arg", "SPLENT_FRESH_LOCK=1") if fresh_lock else ()
|
|
550
634
|
if not committed:
|
|
551
635
|
subprocess.run(
|
|
552
|
-
production_image_build_command(
|
|
636
|
+
production_image_build_command(
|
|
637
|
+
product, workspace, docker_path, tags, extra=extra
|
|
638
|
+
),
|
|
553
639
|
check=True,
|
|
554
640
|
)
|
|
555
641
|
return
|
|
@@ -557,7 +643,7 @@ def build_production_image(
|
|
|
557
643
|
export_commit(os.path.join(workspace, product), tree)
|
|
558
644
|
subprocess.run(
|
|
559
645
|
production_image_build_command(
|
|
560
|
-
product, workspace, docker_path, tags, context=tree
|
|
646
|
+
product, workspace, docker_path, tags, context=tree, extra=extra
|
|
561
647
|
),
|
|
562
648
|
check=True,
|
|
563
649
|
)
|
|
@@ -1572,6 +1658,8 @@ def write_deploy_artifacts(
|
|
|
1572
1658
|
atomic_write(requirements_path, runtime_requirements(workspace), dir_owner=True)
|
|
1573
1659
|
written.append(f"docker/{REQUIREMENTS_FILE}")
|
|
1574
1660
|
click.echo(f"✅ Created: {requirements_path}")
|
|
1661
|
+
ensure_lock(docker_path)
|
|
1662
|
+
written.append(f"docker/{LOCK_FILE}")
|
|
1575
1663
|
unpublished = unpublished_runtime_pins(workspace)
|
|
1576
1664
|
if unpublished:
|
|
1577
1665
|
click.secho(
|
|
@@ -1742,8 +1830,15 @@ def product_build(no_image, skip_preflight):
|
|
|
1742
1830
|
docker_path,
|
|
1743
1831
|
[f"{product}:{bundle.version}", f"{product}:latest"],
|
|
1744
1832
|
stage_model=False,
|
|
1833
|
+
fresh_lock=True,
|
|
1745
1834
|
)
|
|
1746
1835
|
click.echo(f"✅ Image built: {product}:{bundle.version}")
|
|
1836
|
+
pinned = write_lock_from_image(
|
|
1837
|
+
f"{product}:{bundle.version}", product, docker_path
|
|
1838
|
+
)
|
|
1839
|
+
click.echo(
|
|
1840
|
+
f"✅ Pinned {pinned} third-party package(s) in docker/{LOCK_FILE}"
|
|
1841
|
+
)
|
|
1747
1842
|
except subprocess.CalledProcessError:
|
|
1748
1843
|
click.secho("❌ Docker image build failed.", fg="red")
|
|
1749
1844
|
raise SystemExit(1)
|
|
@@ -11,11 +11,13 @@ import tempfile
|
|
|
11
11
|
import click
|
|
12
12
|
from splent_cli.commands.product.product_build import (
|
|
13
13
|
CONTRACTS_SNAPSHOT,
|
|
14
|
+
LOCK_FILE,
|
|
14
15
|
REQUIREMENTS_FILE,
|
|
15
16
|
SPL_STAGING_DIR,
|
|
16
17
|
build_production_image,
|
|
17
18
|
production_dockerfile,
|
|
18
19
|
unpublished_runtime_pins,
|
|
20
|
+
resolve_lock,
|
|
19
21
|
unresolved_pins,
|
|
20
22
|
write_deploy_artifacts,
|
|
21
23
|
)
|
|
@@ -124,6 +126,7 @@ RELEASE_ARTIFACTS = (
|
|
|
124
126
|
# before they exist.
|
|
125
127
|
f"{deploy_bundle.BUNDLE_DIR}/",
|
|
126
128
|
f"docker/{REQUIREMENTS_FILE}",
|
|
129
|
+
f"docker/{LOCK_FILE}",
|
|
127
130
|
CONTRACTS_SNAPSHOT,
|
|
128
131
|
f"docker/{SPL_STAGING_DIR}/",
|
|
129
132
|
)
|
|
@@ -216,6 +219,28 @@ def write_release_artifacts(
|
|
|
216
219
|
# The release about to publish the first image has no tag yet.
|
|
217
220
|
publishes_image=publishes_image,
|
|
218
221
|
)
|
|
222
|
+
if publishes_image:
|
|
223
|
+
# Resolved afresh for every release, so each one picks up the
|
|
224
|
+
# third-party fixes PyPI has, and committed, so a rebuild of the tag
|
|
225
|
+
# installs exactly what the release did.
|
|
226
|
+
require_docker()
|
|
227
|
+
click.echo(" lock resolving the third-party packages...")
|
|
228
|
+
try:
|
|
229
|
+
pinned = resolve_lock(
|
|
230
|
+
product, workspace, os.path.join(product_path, "docker")
|
|
231
|
+
)
|
|
232
|
+
except subprocess.CalledProcessError:
|
|
233
|
+
click.secho(
|
|
234
|
+
" error: the image's build stage did not build, so the "
|
|
235
|
+
"third-party packages could not be pinned. Nothing was "
|
|
236
|
+
"committed; the version bump in pyproject.toml is still to "
|
|
237
|
+
"undo or to release again.",
|
|
238
|
+
fg="red",
|
|
239
|
+
)
|
|
240
|
+
raise SystemExit(1)
|
|
241
|
+
click.echo(
|
|
242
|
+
f" lock {pinned} third-party package(s) pinned in docker/{LOCK_FILE}"
|
|
243
|
+
)
|
|
219
244
|
subprocess.run(
|
|
220
245
|
["git", "add", "--", *bundle.paths],
|
|
221
246
|
cwd=product_path,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: splent_cli
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.32.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.31.0 → splent_cli-1.32.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.31.0 → splent_cli-1.32.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.31.0 → splent_cli-1.32.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.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_sync_template.py
RENAMED
|
File without changes
|
|
File without changes
|
{splent_cli-1.31.0 → splent_cli-1.32.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.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/marketplace/marketplace_index.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_auto_require.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_configure.py
RENAMED
|
File without changes
|
|
File without changes
|
{splent_cli-1.31.0 → splent_cli-1.32.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
|
{splent_cli-1.31.0 → splent_cli-1.32.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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|