splent-cli 1.32.0__tar.gz → 1.33.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.32.0/src/splent_cli.egg-info → splent_cli-1.33.0}/PKG-INFO +1 -1
- {splent_cli-1.32.0 → splent_cli-1.33.0}/pyproject.toml +1 -1
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/product/product_build.py +112 -25
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/product/product_create.py +27 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/product/product_release.py +12 -2
- {splent_cli-1.32.0 → splent_cli-1.33.0/src/splent_cli.egg-info}/PKG-INFO +1 -1
- {splent_cli-1.32.0 → splent_cli-1.33.0}/LICENSE +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/README.md +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/setup.cfg +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/__init__.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/__main__.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/cli.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/__init__.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/cache/__init__.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/cache/cache_clear.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/cache/cache_orphans.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/cache/cache_outdated.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/cache/cache_prune.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/cache/cache_size.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/cache/cache_status.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/cache/cache_usage.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/cache/cache_versions.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/check/__init__.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/check/check_contracts.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/check/check_deps.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/check/check_docker.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/check/check_env.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/check/check_features.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/check/check_github.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/check/check_infra.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/check/check_product.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/check/check_pypi.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/check/check_pyproject.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/check/check_releases.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/clear/__init__.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/clear/clear_build.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/clear/clear_log.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/clear/clear_uploads.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/command/__init__.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/command/command_create.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/coverage.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/database/db_console.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/database/db_dump.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/database/db_migrate.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/database/db_reset.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/database/db_restore.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/database/db_rollback.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/database/db_seed.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/database/db_status.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/database/db_upgrade.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/doctor.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/env/env_list.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/env/env_set.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/env/env_show.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/export/__init__.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/export/export_puml.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_add.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_attach.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_clean.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_clone.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_compat.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_compile.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_contract.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_create.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_delete.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_detach.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_discard.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_drift.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_env.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_fork.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_git.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_hook_add.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_hook_remove.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_hooks.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_impact.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_info.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_inject_config.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_install.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_list.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_order.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_outdated.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_pin.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_pip_install.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_pull.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_refine.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_release.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_remove.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_rename.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_search.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_status.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_sync_template.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_test.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_translate.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_unlock.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_upgrade.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_versions.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_xray.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/lint.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/locust.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/marketplace/login.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/marketplace/logout.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/marketplace/marketplace_auth_utils.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/marketplace/marketplace_index.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/marketplace/whoami.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/product/__init__.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/product/product_auto_require.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/product/product_clean.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/product/product_commands.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/product/product_config.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/product/product_configure.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/product/product_console.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/product/product_containers.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/product/product_deploy.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/product/product_derive.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/product/product_deselect.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/product/product_down.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/product/product_drift.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/product/product_env.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/product/product_list.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/product/product_logs.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/product/product_missing.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/product/product_port.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/product/product_resolve.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/product/product_restart.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/product/product_routes.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/product/product_run.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/product/product_select.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/product/product_shell.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/product/product_signals.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/product/product_sync_template.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/product/product_test.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/product/product_up.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/product/product_validate.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/release/__init__.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/release/release_core.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/release/release_resume.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/selenium.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/spl/__init__.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/spl/spl_add_constraints.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/spl/spl_add_feature.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/spl/spl_compare.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/spl/spl_configurations.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/spl/spl_create.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/spl/spl_deps.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/spl/spl_features.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/spl/spl_fetch.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/spl/spl_info.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/spl/spl_list.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/spl/spl_outdated.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/spl/spl_pin.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/spl/spl_publish.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/spl/spl_remove_feature.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/spl/spl_utils.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/tokens_setup.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/uvl/uvl_utils.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/version.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/services/__init__.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/services/compose.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/services/context.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/services/credentials.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/services/deploy_bundle.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/services/image_registry.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/services/index_refresh.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/services/marketplace.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/services/marketplace_api.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/services/marketplace_url.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/services/preflight.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/services/pypi_quota.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/services/registry.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/services/release.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/services/release_dry_run.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/services/release_gate.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/services/spl_store.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/utils/__init__.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/utils/archetype.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/utils/cache_utils.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/utils/command_loader.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/utils/contract_freshness.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/utils/db_client.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/utils/db_utils.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/utils/decorators.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/utils/dynamic_imports.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/utils/feature_installer.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/utils/feature_utils.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/utils/forge.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/utils/git_url.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/utils/integrity.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/utils/io_utils.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/utils/lifecycle.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/utils/manifest.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/utils/path_utils.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/utils/proc.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/utils/redact.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/utils/refinement_facts.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/utils/template_drift.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/utils/toml_edit.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli/utils/upgrade_plan.py +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli.egg-info/SOURCES.txt +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli.egg-info/dependency_links.txt +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli.egg-info/entry_points.txt +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.0}/src/splent_cli.egg-info/requires.txt +0 -0
- {splent_cli-1.32.0 → splent_cli-1.33.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.33.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
|
|
@@ -38,17 +38,28 @@ USER_TUNABLE_MARKER = "user-tunable"
|
|
|
38
38
|
CONTRACTS_SNAPSHOT = "splent.contracts.json"
|
|
39
39
|
CONTRACTS_FORMAT = 1
|
|
40
40
|
|
|
41
|
-
#
|
|
42
|
-
#
|
|
43
|
-
#
|
|
44
|
-
#
|
|
45
|
-
|
|
46
|
-
|
|
41
|
+
# What the production image installs besides the features, in the product's
|
|
42
|
+
# pyproject.toml beside the feature pins, where pip does not read it: the
|
|
43
|
+
# framework and the CLI as [project] dependencies would replace the editable
|
|
44
|
+
# workspace checkouts development runs on. product:build keeps the framework
|
|
45
|
+
# and the CLI at the versions the product is built with; the production
|
|
46
|
+
# Dockerfile reads the table with tomllib. A bare version means exactly that
|
|
47
|
+
# version, anything else is a pip specifier.
|
|
48
|
+
RUNTIME_TABLE = ("tool", "splent", "runtime")
|
|
49
|
+
RUNTIME_DEFAULTS = {"gunicorn": ">=23,<24"}
|
|
50
|
+
RUNTIME_COMMENT = (
|
|
51
|
+
"# What the production image installs besides the features. splent\n"
|
|
52
|
+
"# product:build keeps splent_framework and splent_cli at the versions this\n"
|
|
53
|
+
"# product is built with; a bare version means exactly that version.\n"
|
|
54
|
+
)
|
|
55
|
+
# Where those pins lived before, in a file of their own. Removed by the build
|
|
56
|
+
# that moves them into pyproject.toml.
|
|
57
|
+
LEGACY_REQUIREMENTS_FILE = "requirements.prod.txt"
|
|
47
58
|
|
|
48
59
|
# Every third-party package the production image installs, at the version the
|
|
49
60
|
# last build resolved, read back from the image with pip freeze. The
|
|
50
61
|
# Dockerfile applies it as a constraint on every pip install, so two builds of
|
|
51
|
-
# one commit install the same set. Versioned
|
|
62
|
+
# one commit install the same set. Versioned in docker/.
|
|
52
63
|
LOCK_FILE = "requirements.lock"
|
|
53
64
|
LOCK_HEADER = (
|
|
54
65
|
"# Every third-party package the production image installs, at the version\n"
|
|
@@ -423,16 +434,43 @@ def runtime_pins(workspace: str) -> dict:
|
|
|
423
434
|
}
|
|
424
435
|
|
|
425
436
|
|
|
426
|
-
def
|
|
427
|
-
"""
|
|
428
|
-
|
|
429
|
-
return (
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
)
|
|
437
|
+
def runtime_requirement(name: str, spec: str) -> str:
|
|
438
|
+
"""One entry of [tool.splent.runtime] as a pip requirement."""
|
|
439
|
+
spec = str(spec).strip()
|
|
440
|
+
return f"{name}=={spec}" if spec[:1].isdigit() else f"{name}{spec}"
|
|
441
|
+
|
|
442
|
+
|
|
443
|
+
def write_runtime_pins(pyproject_path: str, workspace: str) -> dict | None:
|
|
444
|
+
"""Keep [tool.splent.runtime] at the framework and CLI of this build.
|
|
445
|
+
|
|
446
|
+
Other entries (gunicorn, anything the product added) are left as they are,
|
|
447
|
+
and the file is only written when something changes, through the editor
|
|
448
|
+
that keeps comments and layout. Returns the table when it changed.
|
|
449
|
+
"""
|
|
450
|
+
from splent_cli.utils.toml_edit import edit_toml
|
|
451
|
+
|
|
452
|
+
with open(pyproject_path, encoding="utf-8", newline="") as fh:
|
|
453
|
+
text = fh.read()
|
|
454
|
+
data = load_toml(pyproject_path, what="pyproject.toml")
|
|
455
|
+
splent = data.setdefault("tool", {}).setdefault("splent", {})
|
|
456
|
+
current = dict(splent.get("runtime") or {})
|
|
457
|
+
# The framework and the CLI first, where a reader of a new table looks.
|
|
458
|
+
wanted = dict(runtime_pins(workspace))
|
|
459
|
+
for name, spec in {**RUNTIME_DEFAULTS, **current}.items():
|
|
460
|
+
wanted.setdefault(name, spec)
|
|
461
|
+
if wanted == current:
|
|
462
|
+
return None
|
|
463
|
+
splent["runtime"] = wanted
|
|
464
|
+
result = edit_toml(text, data)
|
|
465
|
+
header = "[" + ".".join(RUNTIME_TABLE) + "]"
|
|
466
|
+
lines = result.splitlines(keepends=True)
|
|
467
|
+
for i, line in enumerate(lines):
|
|
468
|
+
if line.strip() == header and not (i and lines[i - 1].lstrip().startswith("#")):
|
|
469
|
+
newline = "\r\n" if line.endswith("\r\n") else "\n"
|
|
470
|
+
lines[i:i] = [c + newline for c in RUNTIME_COMMENT.splitlines()]
|
|
471
|
+
break
|
|
472
|
+
atomic_write(pyproject_path, "".join(lines), newline="")
|
|
473
|
+
return wanted
|
|
436
474
|
|
|
437
475
|
|
|
438
476
|
def _canonical(name: str) -> str:
|
|
@@ -446,8 +484,8 @@ def lock_text(freeze_output: str, product: str) -> str:
|
|
|
446
484
|
|
|
447
485
|
SPLENT's own packages (the framework, the CLI, every feature) and the
|
|
448
486
|
product are left out: their versions are pinned where they are chosen, in
|
|
449
|
-
|
|
450
|
-
|
|
487
|
+
pyproject.toml, and a feature installed from its git tag is not something
|
|
488
|
+
a constraints file can name.
|
|
451
489
|
"""
|
|
452
490
|
product_name = _canonical(product)
|
|
453
491
|
kept = []
|
|
@@ -534,6 +572,35 @@ def production_dockerfile(product: str, docker_path: str) -> str:
|
|
|
534
572
|
return os.path.join(docker_path, f"Dockerfile.{product}.prod")
|
|
535
573
|
|
|
536
574
|
|
|
575
|
+
# What a production Dockerfile from an older CLI does that this one cannot
|
|
576
|
+
# feed, each with what it says about it.
|
|
577
|
+
STALE_DOCKERFILE_MARKERS = (
|
|
578
|
+
(
|
|
579
|
+
"COPY splent_framework",
|
|
580
|
+
"copies splent_framework/ from the workspace, which the product's own "
|
|
581
|
+
"build context does not have",
|
|
582
|
+
),
|
|
583
|
+
(
|
|
584
|
+
LEGACY_REQUIREMENTS_FILE,
|
|
585
|
+
f"installs docker/{LEGACY_REQUIREMENTS_FILE}, which [tool.splent.runtime] "
|
|
586
|
+
"in pyproject.toml replaces",
|
|
587
|
+
),
|
|
588
|
+
)
|
|
589
|
+
|
|
590
|
+
|
|
591
|
+
def stale_dockerfile(dockerfile: str) -> str | None:
|
|
592
|
+
"""Why the production Dockerfile predates this CLI, or None when it does not."""
|
|
593
|
+
try:
|
|
594
|
+
with open(dockerfile, encoding="utf-8") as fh:
|
|
595
|
+
text = fh.read()
|
|
596
|
+
except OSError:
|
|
597
|
+
return None
|
|
598
|
+
for marker, why in STALE_DOCKERFILE_MARKERS:
|
|
599
|
+
if marker in text:
|
|
600
|
+
return why
|
|
601
|
+
return None
|
|
602
|
+
|
|
603
|
+
|
|
537
604
|
def forge_build_args() -> list[str]:
|
|
538
605
|
"""``--build-arg`` pairs for the forge settings that are set."""
|
|
539
606
|
args: list[str] = []
|
|
@@ -1387,8 +1454,8 @@ def write_deploy_artifacts(
|
|
|
1387
1454
|
|
|
1388
1455
|
* ``deploy/``, the bundle a host runs with docker compose alone (see
|
|
1389
1456
|
:mod:`splent_cli.services.deploy_bundle`);
|
|
1390
|
-
* ``
|
|
1391
|
-
installs from PyPI;
|
|
1457
|
+
* ``[tool.splent.runtime]`` in pyproject.toml, the framework and CLI the
|
|
1458
|
+
image installs from PyPI;
|
|
1392
1459
|
* ``splent.contracts.json`` and ``docker/spl/``, the refinement metadata
|
|
1393
1460
|
and the UVL model the image reads.
|
|
1394
1461
|
|
|
@@ -1654,10 +1721,21 @@ def write_deploy_artifacts(
|
|
|
1654
1721
|
# ---------------------------------------------------------
|
|
1655
1722
|
# 4) What the image installs and reads, pinned
|
|
1656
1723
|
# ---------------------------------------------------------
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
|
|
1724
|
+
pins = write_runtime_pins(pyproject_path, workspace)
|
|
1725
|
+
written.append("pyproject.toml")
|
|
1726
|
+
if pins:
|
|
1727
|
+
click.echo(
|
|
1728
|
+
"✅ Pinned "
|
|
1729
|
+
+ ", ".join(f"{name} {spec}" for name, spec in pins.items())
|
|
1730
|
+
+ " in pyproject.toml [tool.splent.runtime]"
|
|
1731
|
+
)
|
|
1732
|
+
legacy_requirements = os.path.join(docker_path, LEGACY_REQUIREMENTS_FILE)
|
|
1733
|
+
if os.path.isfile(legacy_requirements):
|
|
1734
|
+
os.remove(legacy_requirements)
|
|
1735
|
+
click.echo(
|
|
1736
|
+
click.style(" removed ", dim=True)
|
|
1737
|
+
+ f"docker/{LEGACY_REQUIREMENTS_FILE}, now [tool.splent.runtime]"
|
|
1738
|
+
)
|
|
1661
1739
|
ensure_lock(docker_path)
|
|
1662
1740
|
written.append(f"docker/{LOCK_FILE}")
|
|
1663
1741
|
unpublished = unpublished_runtime_pins(workspace)
|
|
@@ -1821,6 +1899,15 @@ def product_build(no_image, skip_preflight):
|
|
|
1821
1899
|
f" Run 'splent product:sync-template' to generate it.",
|
|
1822
1900
|
fg="yellow",
|
|
1823
1901
|
)
|
|
1902
|
+
elif stale := stale_dockerfile(dockerfile):
|
|
1903
|
+
click.secho(
|
|
1904
|
+
f"\n❌ docker/{os.path.basename(dockerfile)} comes from an older "
|
|
1905
|
+
f"CLI, it {stale}.\n"
|
|
1906
|
+
f" Run 'splent product:sync-template {product} --docker' and "
|
|
1907
|
+
"build again.",
|
|
1908
|
+
fg="red",
|
|
1909
|
+
)
|
|
1910
|
+
raise SystemExit(1)
|
|
1824
1911
|
else:
|
|
1825
1912
|
click.echo(f"\n🐳 Building Docker image: {product}:{bundle.version}...")
|
|
1826
1913
|
try:
|
|
@@ -31,6 +31,27 @@ except Exception:
|
|
|
31
31
|
PRODUCT_NAME_RE = re.compile(r"^[a-z_][a-z0-9_]*$")
|
|
32
32
|
|
|
33
33
|
|
|
34
|
+
def _runtime_versions() -> tuple[str, str]:
|
|
35
|
+
"""The framework and CLI versions a new product's image installs.
|
|
36
|
+
|
|
37
|
+
The ones product:build pins, so the first build leaves them as they are.
|
|
38
|
+
Empty when one cannot be read, which installs whatever PyPI serves until
|
|
39
|
+
that first build pins it.
|
|
40
|
+
"""
|
|
41
|
+
from splent_cli.commands.product.product_build import (
|
|
42
|
+
cli_version,
|
|
43
|
+
framework_version,
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
versions = []
|
|
47
|
+
for read in (lambda: framework_version(str(context.workspace())), cli_version):
|
|
48
|
+
try:
|
|
49
|
+
versions.append(read())
|
|
50
|
+
except Exception: # noqa: BLE001 - only the default runtime pins depend on it
|
|
51
|
+
versions.append("")
|
|
52
|
+
return versions[0], versions[1]
|
|
53
|
+
|
|
54
|
+
|
|
34
55
|
def validate_product_name(name: str) -> None:
|
|
35
56
|
"""Refuse a name that cannot be a Python package.
|
|
36
57
|
|
|
@@ -202,6 +223,7 @@ def make_product(name, spl_name, spl_doi, features_file, force):
|
|
|
202
223
|
except Exception:
|
|
203
224
|
pass
|
|
204
225
|
|
|
226
|
+
runtime_framework, runtime_cli = _runtime_versions()
|
|
205
227
|
template_ctx = {
|
|
206
228
|
"product_name": name,
|
|
207
229
|
"pascal_name": pascalcase(name),
|
|
@@ -212,6 +234,11 @@ def make_product(name, spl_name, spl_doi, features_file, force):
|
|
|
212
234
|
"mailhog_port_one": mailhog_port_one,
|
|
213
235
|
"mailhog_port_two": mailhog_port_two,
|
|
214
236
|
"cli_version": _CLI_VERSION,
|
|
237
|
+
# [tool.splent.runtime]: what the production image installs. The
|
|
238
|
+
# same versions product:build would write, so a new product's image
|
|
239
|
+
# builds before its first product:build.
|
|
240
|
+
"runtime_framework": runtime_framework,
|
|
241
|
+
"runtime_cli": runtime_cli,
|
|
215
242
|
"network_name": "splent_network",
|
|
216
243
|
"spl_name": spl_name or "",
|
|
217
244
|
"spl_mirror": pin.mirror,
|
|
@@ -12,12 +12,12 @@ import click
|
|
|
12
12
|
from splent_cli.commands.product.product_build import (
|
|
13
13
|
CONTRACTS_SNAPSHOT,
|
|
14
14
|
LOCK_FILE,
|
|
15
|
-
REQUIREMENTS_FILE,
|
|
16
15
|
SPL_STAGING_DIR,
|
|
17
16
|
build_production_image,
|
|
18
17
|
production_dockerfile,
|
|
19
18
|
unpublished_runtime_pins,
|
|
20
19
|
resolve_lock,
|
|
20
|
+
stale_dockerfile,
|
|
21
21
|
unresolved_pins,
|
|
22
22
|
write_deploy_artifacts,
|
|
23
23
|
)
|
|
@@ -125,7 +125,6 @@ RELEASE_ARTIFACTS = (
|
|
|
125
125
|
# Directories end in "/", so git matches directory rules against them
|
|
126
126
|
# before they exist.
|
|
127
127
|
f"{deploy_bundle.BUNDLE_DIR}/",
|
|
128
|
-
f"docker/{REQUIREMENTS_FILE}",
|
|
129
128
|
f"docker/{LOCK_FILE}",
|
|
130
129
|
CONTRACTS_SNAPSHOT,
|
|
131
130
|
f"docker/{SPL_STAGING_DIR}/",
|
|
@@ -187,6 +186,17 @@ def _guard_deployable(workspace: str, product: str, product_path: str) -> None:
|
|
|
187
186
|
)
|
|
188
187
|
raise SystemExit(1)
|
|
189
188
|
|
|
189
|
+
dockerfile = production_dockerfile(product, os.path.join(product_path, "docker"))
|
|
190
|
+
stale = stale_dockerfile(dockerfile)
|
|
191
|
+
if stale:
|
|
192
|
+
click.secho(
|
|
193
|
+
f" Cannot release: docker/{os.path.basename(dockerfile)} comes from "
|
|
194
|
+
f"an older CLI, it {stale}. Run splent product:sync-template "
|
|
195
|
+
f"{product} --docker, commit it and release again.",
|
|
196
|
+
fg="red",
|
|
197
|
+
)
|
|
198
|
+
raise SystemExit(1)
|
|
199
|
+
|
|
190
200
|
ignored = subprocess.run(
|
|
191
201
|
["git", "check-ignore", "--no-index", *RELEASE_ARTIFACTS],
|
|
192
202
|
capture_output=True,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: splent_cli
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.33.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.32.0 → splent_cli-1.33.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.32.0 → splent_cli-1.33.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.32.0 → splent_cli-1.33.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.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/feature/feature_sync_template.py
RENAMED
|
File without changes
|
|
File without changes
|
{splent_cli-1.32.0 → splent_cli-1.33.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.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/marketplace/marketplace_index.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{splent_cli-1.32.0 → splent_cli-1.33.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.32.0 → splent_cli-1.33.0}/src/splent_cli/commands/product/product_configure.py
RENAMED
|
File without changes
|
|
File without changes
|
{splent_cli-1.32.0 → splent_cli-1.33.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
|
{splent_cli-1.32.0 → splent_cli-1.33.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
|