splent-cli 1.43.0__tar.gz → 1.44.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.43.0/src/splent_cli.egg-info → splent_cli-1.44.0}/PKG-INFO +1 -1
- {splent_cli-1.43.0 → splent_cli-1.44.0}/pyproject.toml +1 -1
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/cli.py +12 -3
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/check/check_env.py +2 -1
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/clear/clear_uploads.py +2 -2
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/database/db_reset.py +1 -1
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/database/db_rollback.py +1 -1
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/database/db_seed.py +3 -3
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/database/db_upgrade.py +1 -1
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/doctor.py +2 -1
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_release.py +1 -1
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_rename.py +2 -3
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_test.py +3 -3
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_commands.py +2 -4
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_create.py +15 -2
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_list.py +1 -2
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_release.py +1 -2
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_test.py +1 -1
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/uvl/uvl_utils.py +4 -11
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/version.py +1 -1
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/compose.py +10 -1
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/context.py +88 -13
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/spl_store.py +3 -2
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/ci_workflow.py +3 -1
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/dynamic_imports.py +3 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0/src/splent_cli.egg-info}/PKG-INFO +1 -1
- {splent_cli-1.43.0 → splent_cli-1.44.0}/COPYING +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/COPYING.LESSER +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/README.md +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/setup.cfg +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/__init__.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/__main__.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/__init__.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/cache/__init__.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/cache/cache_clear.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/cache/cache_orphans.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/cache/cache_outdated.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/cache/cache_prune.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/cache/cache_size.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/cache/cache_status.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/cache/cache_usage.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/cache/cache_versions.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/check/__init__.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/check/check_contracts.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/check/check_deps.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/check/check_docker.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/check/check_features.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/check/check_github.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/check/check_infra.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/check/check_product.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/check/check_pypi.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/check/check_pyproject.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/check/check_releases.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/check/check_vendor.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/clear/__init__.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/clear/clear_build.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/clear/clear_log.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/command/__init__.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/command/command_create.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/coverage.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/database/db_console.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/database/db_dump.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/database/db_migrate.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/database/db_restore.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/database/db_status.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/env/env_list.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/env/env_set.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/env/env_show.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/export/__init__.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/export/export_puml.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_add.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_attach.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_clean.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_clone.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_compat.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_compile.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_contract.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_create.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_delete.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_detach.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_discard.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_drift.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_env.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_fork.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_git.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_hook_add.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_hook_remove.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_hooks.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_impact.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_info.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_inject_config.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_install.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_list.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_order.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_outdated.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_pin.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_pip_install.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_pull.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_refine.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_remove.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_search.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_status.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_sync_template.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_translate.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_unlock.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_upgrade.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_versions.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_xray.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/lint.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/locust.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/marketplace/login.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/marketplace/logout.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/marketplace/marketplace_auth_utils.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/marketplace/marketplace_index.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/marketplace/whoami.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/__init__.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_auto_require.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_build.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_clean.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_config.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_configure.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_console.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_containers.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_deploy.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_derive.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_deselect.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_down.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_drift.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_env.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_logs.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_missing.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_params.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_port.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_resolve.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_restart.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_routes.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_run.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_select.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_shell.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_signals.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_sync_template.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_up.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_validate.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/release/__init__.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/release/release_core.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/release/release_resume.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/selenium.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/spl/__init__.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/spl/spl_add_constraints.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/spl/spl_add_feature.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/spl/spl_compare.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/spl/spl_configurations.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/spl/spl_create.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/spl/spl_deps.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/spl/spl_features.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/spl/spl_fetch.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/spl/spl_info.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/spl/spl_list.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/spl/spl_outdated.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/spl/spl_pin.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/spl/spl_publish.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/spl/spl_remove_feature.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/spl/spl_utils.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/tokens_setup.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/__init__.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/credentials.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/deploy_bundle.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/image_registry.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/index_refresh.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/marketplace.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/marketplace_api.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/marketplace_url.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/neutral_app.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/own_commands.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/preflight.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/pypi_quota.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/registry.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/release.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/release_dry_run.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/release_gate.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/web_container.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_.gitignore.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_MANIFEST.in.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_README.md.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_commands.py.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_config.py.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_docker-compose.dev.yml.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_docker-compose.prod.yml.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_docker.env.example.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_forms.py.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_hooks.py.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_init.py.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_init_config.py.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_init_light.py.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_init_service.py.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_migrations_alembic.ini.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_migrations_env.py.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_migrations_script.py.mako.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_models.py.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_pyproject.toml.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_pyproject_minimal.toml.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_repositories.py.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_routes.py.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_scripts.js.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_seeders.py.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_services.py.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_services_service.py.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_signals.py.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_templates_index.html.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_tests_conftest.py.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_tests_e2e.py.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_tests_functional.py.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_tests_integration.py.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_tests_locustfile.py.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_tests_unit.py.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_webpack.config.js.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/licenses/COPYING +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/licenses/COPYING.LESSER +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_.env.dev.example.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_.env.prod.example.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_.gitignore.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_00_core_requirements_dev.sh.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_00_install_features.sh.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_01_compile_assets.sh.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_02_0_db_wait_connection.sh.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_02_1_db_create_db_test.sh.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_02_2_db_create_splent_migrations.sh.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_03_initialize_migrations.sh.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_04_handle_migrations.sh.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_05_0_start_app_dev.sh.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_05_1_start_app_prod.sh.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_400.html +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_401.html +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_404.html +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_500.html +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_Dockerfile.dev.dockerignore.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_Dockerfile.dev.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_Dockerfile.prod.dockerignore.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_Dockerfile.prod.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_README.md.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_app.css +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_app.js +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_base_template.html +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_ci_upgrade.yml.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_ci_validate.yml.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_config.py.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_docker-compose.dev.yml.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_docker-compose.prod.yml.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_dropzone.css +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_entrypoint.dev.sh.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_entrypoint.prod.sh.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_errors.py.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_favicon.svg +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_init.py.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_logging.py.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_own.css +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_package.json.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_pyproject.toml.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_uvl.j2 +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/__init__.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/archetype.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/cache_utils.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/ci_services.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/command_loader.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/contract_freshness.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/db_client.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/db_utils.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/decorators.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/feature_installer.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/feature_naming.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/feature_params.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/feature_requirements.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/feature_resolution.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/feature_utils.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/forge.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/git_url.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/integrity.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/io_utils.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/lifecycle.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/manifest.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/menu_keys.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/migration_lock.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/path_utils.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/proc.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/redact.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/refinement_facts.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/running_version.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/template_drift.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/toml_edit.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/upgrade_plan.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/uvl_params.py +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli.egg-info/SOURCES.txt +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli.egg-info/dependency_links.txt +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli.egg-info/entry_points.txt +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli.egg-info/requires.txt +0 -0
- {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli.egg-info/top_level.txt +0 -0
|
@@ -5,10 +5,13 @@ import os
|
|
|
5
5
|
import click
|
|
6
6
|
from dotenv import load_dotenv
|
|
7
7
|
|
|
8
|
+
from splent_cli.services import context
|
|
8
9
|
from splent_cli.utils.command_loader import load_commands
|
|
9
10
|
|
|
10
11
|
# From here on os.environ holds the workspace .env as well. What the shell
|
|
11
12
|
# itself exported is splent_cli.SHELL_ENV, taken before this line ran.
|
|
13
|
+
# Nothing exported is replaced, so a SPLENT_APP given to one command beats
|
|
14
|
+
# the selection in the file (context.active_app has the whole rule).
|
|
12
15
|
load_dotenv()
|
|
13
16
|
|
|
14
17
|
|
|
@@ -122,7 +125,7 @@ class SPLENTCLI(click.Group):
|
|
|
122
125
|
app = get_app()
|
|
123
126
|
with app.app_context():
|
|
124
127
|
self._own_cmds_cache = own_commands.collect(
|
|
125
|
-
|
|
128
|
+
context.active_app(), set(self.commands)
|
|
126
129
|
)
|
|
127
130
|
except Exception as e:
|
|
128
131
|
if debug:
|
|
@@ -170,7 +173,7 @@ class SPLENTCLI(click.Group):
|
|
|
170
173
|
"""
|
|
171
174
|
from splent_cli.services import web_container
|
|
172
175
|
|
|
173
|
-
product =
|
|
176
|
+
product = context.active_app()
|
|
174
177
|
if not product or web_container.is_product_container():
|
|
175
178
|
return
|
|
176
179
|
if not web_container.running(web_container.name(product)):
|
|
@@ -196,6 +199,12 @@ class SPLENTCLI(click.Group):
|
|
|
196
199
|
from splent_cli.utils.dynamic_imports import get_app
|
|
197
200
|
from splent_cli.utils.db_utils import check_db_connection
|
|
198
201
|
|
|
202
|
+
# For another product than the selection the CLI's container stays
|
|
203
|
+
# on the selection's network (compose.attach_self_to_network), so
|
|
204
|
+
# what reaches this product's services runs where they are.
|
|
205
|
+
if context.is_override():
|
|
206
|
+
self._delegate_to_the_product(ctx)
|
|
207
|
+
|
|
199
208
|
try:
|
|
200
209
|
app = get_app()
|
|
201
210
|
except Exception as exc:
|
|
@@ -205,7 +214,7 @@ class SPLENTCLI(click.Group):
|
|
|
205
214
|
# Only then: where the app builds here, the command runs here
|
|
206
215
|
# with the tools the CLI image has (ruff formats migrations).
|
|
207
216
|
self._delegate_to_the_product(ctx)
|
|
208
|
-
product =
|
|
217
|
+
product = context.active_app() or "The product"
|
|
209
218
|
raise click.ClickException(
|
|
210
219
|
f"{product}'s features need {missing}, which the product's "
|
|
211
220
|
"image installs and the CLI's does not.\n"
|
|
@@ -8,6 +8,7 @@ import sys
|
|
|
8
8
|
import click
|
|
9
9
|
import importlib.metadata
|
|
10
10
|
|
|
11
|
+
from splent_cli.services import context
|
|
11
12
|
from splent_cli.services.release_gate import pypi_credentials
|
|
12
13
|
from splent_cli.utils import forge
|
|
13
14
|
|
|
@@ -61,7 +62,7 @@ def check_env():
|
|
|
61
62
|
_warn(".env file not found in workspace")
|
|
62
63
|
|
|
63
64
|
# SPLENT_APP
|
|
64
|
-
app =
|
|
65
|
+
app = context.active_app(workspace)
|
|
65
66
|
if app:
|
|
66
67
|
app_path = os.path.join(workspace, app)
|
|
67
68
|
if os.path.isdir(app_path):
|
|
@@ -99,7 +99,7 @@ def resolve_uploads_dir(app=None) -> str:
|
|
|
99
99
|
product or its package, anything holding one of them, or a directory with
|
|
100
100
|
code at its top.
|
|
101
101
|
"""
|
|
102
|
-
product =
|
|
102
|
+
product = context.active_app() or ""
|
|
103
103
|
if not product or product in (".", "..") or os.sep in product or "/" in product:
|
|
104
104
|
raise UploadsDirError(f"'{product}' is not a valid product name.")
|
|
105
105
|
|
|
@@ -279,7 +279,7 @@ def clear_uploads(env_dev, env_prod, yes):
|
|
|
279
279
|
click.echo(click.style("Cannot specify both --dev and --prod.", fg="red"))
|
|
280
280
|
raise SystemExit(1)
|
|
281
281
|
env = context.resolve_env(env_dev, env_prod)
|
|
282
|
-
_run_where_the_uploads_are(
|
|
282
|
+
_run_where_the_uploads_are(context.active_app() or "", env, yes)
|
|
283
283
|
|
|
284
284
|
try:
|
|
285
285
|
uploads_dir = resolve_uploads_dir()
|
|
@@ -199,7 +199,7 @@ def db_reset(feature_name, yes):
|
|
|
199
199
|
"""
|
|
200
200
|
app = current_app
|
|
201
201
|
product_path = PathUtils.get_app_base_dir()
|
|
202
|
-
product_name =
|
|
202
|
+
product_name = context.active_app() or ""
|
|
203
203
|
|
|
204
204
|
if feature_name:
|
|
205
205
|
_reset_one_feature(app, feature_name, yes, product_path, product_name)
|
|
@@ -140,7 +140,7 @@ def _downgrade(directory: str, revision: str) -> None:
|
|
|
140
140
|
def db_rollback(feature, steps, to_base, cascade):
|
|
141
141
|
app = current_app
|
|
142
142
|
product_path = PathUtils.get_app_base_dir()
|
|
143
|
-
product_name =
|
|
143
|
+
product_name = context.active_app() or ""
|
|
144
144
|
|
|
145
145
|
if to_base:
|
|
146
146
|
source = click.get_current_context().get_parameter_source("steps")
|
|
@@ -23,7 +23,7 @@ def _resolve_feature_order(features_raw: list[str]) -> list[str]:
|
|
|
23
23
|
feature it refines (the refinement metadata the boot reads), with or
|
|
24
24
|
without a UVL. Features with neither keep their declared order.
|
|
25
25
|
"""
|
|
26
|
-
splent_app =
|
|
26
|
+
splent_app = context.active_app() or ""
|
|
27
27
|
working_dir = os.getenv("WORKING_DIR", "/workspace")
|
|
28
28
|
product_dir = os.path.join(working_dir, splent_app) if splent_app else ""
|
|
29
29
|
|
|
@@ -112,7 +112,7 @@ def _product_seeders(errors):
|
|
|
112
112
|
They are always loaded, also when a single module is seeded, because
|
|
113
113
|
their ``replaces`` decide which feature seeders may run at all.
|
|
114
114
|
"""
|
|
115
|
-
product =
|
|
115
|
+
product = context.active_app()
|
|
116
116
|
if not product:
|
|
117
117
|
return []
|
|
118
118
|
return _load_seeders(f"{product}.seeders", errors, label="product seeders")
|
|
@@ -154,7 +154,7 @@ def get_installed_seeders(specific_module=None):
|
|
|
154
154
|
)
|
|
155
155
|
|
|
156
156
|
targets = _module_names(specific_module) if specific_module else None
|
|
157
|
-
if targets and
|
|
157
|
+
if targets and context.active_app() in targets:
|
|
158
158
|
return product_seeders, errors
|
|
159
159
|
|
|
160
160
|
seeders = []
|
|
@@ -79,7 +79,7 @@ def _mark_without_migrations(
|
|
|
79
79
|
|
|
80
80
|
def _resolve_product():
|
|
81
81
|
"""Return (product_path, product_name) from env."""
|
|
82
|
-
product =
|
|
82
|
+
product = context.active_app() or ""
|
|
83
83
|
product_path = PathUtils.get_app_base_dir()
|
|
84
84
|
return product_path, product
|
|
85
85
|
|
|
@@ -19,6 +19,7 @@ from splent_cli.commands.check.check_product import check_product
|
|
|
19
19
|
from splent_cli.commands.feature.feature_status import feature_status
|
|
20
20
|
from splent_cli.commands.database.db_status import db_status
|
|
21
21
|
from splent_cli.commands.product.product_containers import product_docker
|
|
22
|
+
from splent_cli.services import context
|
|
22
23
|
|
|
23
24
|
|
|
24
25
|
SECTIONS = [
|
|
@@ -74,7 +75,7 @@ def _check_workspace_precondition():
|
|
|
74
75
|
elif not os.path.isdir(wd):
|
|
75
76
|
problems.append(f"WORKING_DIR points to a missing directory: {wd}")
|
|
76
77
|
|
|
77
|
-
app =
|
|
78
|
+
app = context.active_app(workspace)
|
|
78
79
|
if not app:
|
|
79
80
|
problems.append("SPLENT_APP is not set")
|
|
80
81
|
elif not os.path.isdir(os.path.join(workspace, app)):
|
|
@@ -2572,7 +2572,7 @@ def _dry_run(
|
|
|
2572
2572
|
|
|
2573
2573
|
tag = f"v{version.lstrip('v')}"
|
|
2574
2574
|
git_state = release_dry_run.read_git_state(feature_path, tag)
|
|
2575
|
-
product =
|
|
2575
|
+
product = context.active_app()
|
|
2576
2576
|
|
|
2577
2577
|
rehearsal = release_dry_run.rehearse_feature_release(
|
|
2578
2578
|
feature_path=feature_path,
|
|
@@ -96,9 +96,8 @@ def feature_rename(old_name, new_name, namespace):
|
|
|
96
96
|
# -----------------------------
|
|
97
97
|
# Context
|
|
98
98
|
# -----------------------------
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
) # optional — used to update pyproject.toml if set
|
|
99
|
+
# Optional: the active product's pyproject.toml is updated when there is one.
|
|
100
|
+
splent_app = context.active_app()
|
|
102
101
|
pyproject_path = None
|
|
103
102
|
features_list = []
|
|
104
103
|
feature_is_active = False
|
|
@@ -243,13 +243,13 @@ def _is_prod_active(product: str | None = None) -> bool:
|
|
|
243
243
|
``export``), so a hand-edited ``SPLENT_ENV="prod"`` still counts
|
|
244
244
|
3. SPLENT_ENV from the product's running web container
|
|
245
245
|
"""
|
|
246
|
-
product = product or
|
|
246
|
+
product = product or context.active_app()
|
|
247
247
|
if not product:
|
|
248
248
|
return False
|
|
249
249
|
|
|
250
250
|
if (
|
|
251
251
|
_is_product_container()
|
|
252
|
-
and product ==
|
|
252
|
+
and product == context.active_app()
|
|
253
253
|
and _is_prod(os.getenv("SPLENT_ENV"))
|
|
254
254
|
):
|
|
255
255
|
return True
|
|
@@ -614,7 +614,7 @@ def feature_src_dirs(sources: list[tuple[str, Path]] = ()) -> list[str]:
|
|
|
614
614
|
and the app then failed on a module only the pinned auth has.
|
|
615
615
|
"""
|
|
616
616
|
workspace = context.workspace()
|
|
617
|
-
product =
|
|
617
|
+
product = context.active_app()
|
|
618
618
|
dirs: list[str] = []
|
|
619
619
|
seen: set[str] = set()
|
|
620
620
|
for name, root in sources:
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import os
|
|
2
|
-
|
|
3
1
|
import click
|
|
4
2
|
from flask import current_app
|
|
5
3
|
|
|
@@ -66,7 +64,7 @@ def _own_commands():
|
|
|
66
64
|
"""The product's own commands, against the CLI's built-in names."""
|
|
67
65
|
from splent_cli.cli import cli
|
|
68
66
|
|
|
69
|
-
return own_commands.collect(
|
|
67
|
+
return own_commands.collect(context.active_app(), set(cli.commands))
|
|
70
68
|
|
|
71
69
|
|
|
72
70
|
@requires_app
|
|
@@ -80,7 +78,7 @@ def product_commands():
|
|
|
80
78
|
product's own (product:<name>, from its commands module)."""
|
|
81
79
|
registry = current_app.extensions.get("splent_feature_commands", {})
|
|
82
80
|
own = _own_commands()
|
|
83
|
-
product =
|
|
81
|
+
product = context.active_app() or "product"
|
|
84
82
|
|
|
85
83
|
if not registry and not own.commands and not own.shadowed and not own.error:
|
|
86
84
|
click.echo()
|
|
@@ -130,8 +130,21 @@ def copy_raw_file(template_name, filename):
|
|
|
130
130
|
@click.option(
|
|
131
131
|
"--force", is_flag=True, help="Overwrite the product if it already exists."
|
|
132
132
|
)
|
|
133
|
-
@
|
|
134
|
-
|
|
133
|
+
@click.option(
|
|
134
|
+
"--no-select",
|
|
135
|
+
is_flag=True,
|
|
136
|
+
help="Leave the selection as it is: create the product while another one "
|
|
137
|
+
"is selected, and do not select the new one.",
|
|
138
|
+
)
|
|
139
|
+
def make_product(name, spl_name, spl_doi, features_file, force, no_select):
|
|
140
|
+
# Creating never selects. Without --no-select nothing may be selected,
|
|
141
|
+
# so a product is not created by mistake while working on another. With
|
|
142
|
+
# it the product is created while another one is selected, and that one
|
|
143
|
+
# stays selected: the workspace .env is never written here.
|
|
144
|
+
if not no_select:
|
|
145
|
+
context.refuse_active_app(
|
|
146
|
+
"Or pass --no-select to create it and leave the selection as it is."
|
|
147
|
+
)
|
|
135
148
|
validate_product_name(name)
|
|
136
149
|
workspace_path = context.workspace()
|
|
137
150
|
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import os
|
|
2
1
|
import tomllib
|
|
3
2
|
import click
|
|
4
3
|
from pathlib import Path
|
|
@@ -30,7 +29,7 @@ def _product_info(product_dir: Path) -> dict | None:
|
|
|
30
29
|
def product_list():
|
|
31
30
|
"""Lists all products found in the workspace, with their version and feature count."""
|
|
32
31
|
workspace = context.workspace()
|
|
33
|
-
active =
|
|
32
|
+
active = context.active_app()
|
|
34
33
|
|
|
35
34
|
if not workspace.exists():
|
|
36
35
|
click.secho(f"❌ Workspace not found: {workspace}", fg="red")
|
|
@@ -393,7 +393,6 @@ def _left_out_flags(channels) -> list[str]:
|
|
|
393
393
|
is_flag=True,
|
|
394
394
|
help="If PyPI's new-project limit is spent, wait for it however long it takes.",
|
|
395
395
|
)
|
|
396
|
-
@context.requires_product
|
|
397
396
|
def product_release(
|
|
398
397
|
version,
|
|
399
398
|
product,
|
|
@@ -406,7 +405,7 @@ def product_release(
|
|
|
406
405
|
wait,
|
|
407
406
|
):
|
|
408
407
|
no_forge = release.no_forge_requested(no_forge, no_github)
|
|
409
|
-
product = product or
|
|
408
|
+
product = product or context.active_app()
|
|
410
409
|
if not product:
|
|
411
410
|
click.secho(" error: no product specified and SPLENT_APP not set", fg="red")
|
|
412
411
|
raise SystemExit(1)
|
|
@@ -179,7 +179,7 @@ def _run_own_tests(product, verbose) -> None:
|
|
|
179
179
|
if product:
|
|
180
180
|
# Everything below reads the product from SPLENT_APP, as the
|
|
181
181
|
# container does, where the exec sets it.
|
|
182
|
-
|
|
182
|
+
context.use_app(product)
|
|
183
183
|
product = context.require_app()
|
|
184
184
|
if not web_container.is_product_container():
|
|
185
185
|
argv = ["product:test", "--own-tests"] + (["-v"] if verbose else [])
|
|
@@ -11,8 +11,8 @@ from pathlib import Path
|
|
|
11
11
|
|
|
12
12
|
import click
|
|
13
13
|
import tomllib
|
|
14
|
-
from dotenv import dotenv_values
|
|
15
14
|
|
|
15
|
+
from splent_cli.services import context
|
|
16
16
|
from splent_cli.utils.feature_utils import read_features_from_data
|
|
17
17
|
|
|
18
18
|
DEFAULT_UVLHUB_URL = "https://www.uvlhub.io"
|
|
@@ -40,16 +40,9 @@ def _discover_metamodels():
|
|
|
40
40
|
|
|
41
41
|
|
|
42
42
|
def read_splent_app(workspace: str) -> str:
|
|
43
|
-
"""
|
|
44
|
-
|
|
45
|
-
app_name =
|
|
46
|
-
|
|
47
|
-
# Fallback: read from .env file, parsed like every other .env reader
|
|
48
|
-
# (quotes, 'export ' and inline comments).
|
|
49
|
-
if not app_name:
|
|
50
|
-
env_path = os.path.join(workspace, ".env")
|
|
51
|
-
if os.path.exists(env_path):
|
|
52
|
-
app_name = (dotenv_values(env_path).get("SPLENT_APP") or "").strip()
|
|
43
|
+
"""The active product (context.active_app, WORKSPACE's .env selecting
|
|
44
|
+
when the environment does not), checked to be a folder of WORKSPACE."""
|
|
45
|
+
app_name = context.active_app(workspace)
|
|
53
46
|
|
|
54
47
|
if not app_name:
|
|
55
48
|
raise click.ClickException(
|
|
@@ -105,7 +105,7 @@ def version(as_json: bool) -> None:
|
|
|
105
105
|
mean identical workspace states.
|
|
106
106
|
"""
|
|
107
107
|
workspace = str(context.workspace())
|
|
108
|
-
app_name =
|
|
108
|
+
app_name = context.active_app()
|
|
109
109
|
|
|
110
110
|
cli_v = _workspace_pkg_version(workspace, "splent_cli") or "unknown"
|
|
111
111
|
fw_v = _workspace_pkg_version(workspace, "splent_framework") or "unknown"
|
|
@@ -9,6 +9,7 @@ from pathlib import Path
|
|
|
9
9
|
|
|
10
10
|
import click
|
|
11
11
|
|
|
12
|
+
from splent_cli.services import context
|
|
12
13
|
from splent_cli.utils.feature_utils import normalize_namespace
|
|
13
14
|
|
|
14
15
|
# Bounded wait for a docker probe that only reads state. Interactive and
|
|
@@ -224,8 +225,16 @@ def attach_self_to_network(name: str) -> bool:
|
|
|
224
225
|
Silent and idempotent. False when there is nothing to attach (running on
|
|
225
226
|
the host rather than in a container) or docker cannot be asked; either way
|
|
226
227
|
the caller carries on and the real command reports the real problem.
|
|
228
|
+
|
|
229
|
+
False too, and nothing moves, for a command on another product than the
|
|
230
|
+
workspace's selection (``SPLENT_APP=other splent ...``). The CLI's
|
|
231
|
+
container is shared by every command of the workspace, and moving it
|
|
232
|
+
took the selected product's database away from whatever was running for
|
|
233
|
+
that product at the time, a release gate included. It stays on the
|
|
234
|
+
selection's network; the other product's commands that need its
|
|
235
|
+
services run in its web container (cli.py).
|
|
227
236
|
"""
|
|
228
|
-
if not os.path.exists("/.dockerenv"):
|
|
237
|
+
if not os.path.exists("/.dockerenv") or context.is_override():
|
|
229
238
|
return False
|
|
230
239
|
|
|
231
240
|
# A container's hostname is its own short id unless someone overrode it,
|
|
@@ -3,6 +3,7 @@ import os
|
|
|
3
3
|
from pathlib import Path
|
|
4
4
|
|
|
5
5
|
import click
|
|
6
|
+
from dotenv import dotenv_values
|
|
6
7
|
|
|
7
8
|
|
|
8
9
|
def workspace_in_reach() -> Path | None:
|
|
@@ -37,7 +38,7 @@ def require_app() -> str:
|
|
|
37
38
|
name product:create would reject, so a product with an older name still
|
|
38
39
|
works.
|
|
39
40
|
"""
|
|
40
|
-
product =
|
|
41
|
+
product = active_app()
|
|
41
42
|
if not product:
|
|
42
43
|
click.secho("❌ SPLENT_APP not set.", fg="red")
|
|
43
44
|
raise SystemExit(1)
|
|
@@ -56,9 +57,73 @@ def require_app() -> str:
|
|
|
56
57
|
return product
|
|
57
58
|
|
|
58
59
|
|
|
59
|
-
def active_app() -> str | None:
|
|
60
|
-
"""
|
|
61
|
-
|
|
60
|
+
def active_app(workspace_path: str | os.PathLike | None = None) -> str | None:
|
|
61
|
+
"""The active product, or None in detached mode (no error).
|
|
62
|
+
|
|
63
|
+
One rule decides it, for every command:
|
|
64
|
+
|
|
65
|
+
1. The command's own option, where it has one (product:test --product,
|
|
66
|
+
product:release --product), which the command puts in the
|
|
67
|
+
environment for what it runs (:func:`use_app`).
|
|
68
|
+
2. SPLENT_APP in the process environment, an override for one command
|
|
69
|
+
that leaves the workspace's selection alone::
|
|
70
|
+
|
|
71
|
+
SPLENT_APP=other_product splent product:validate
|
|
72
|
+
|
|
73
|
+
Set but empty, it means no product, for that command alone.
|
|
74
|
+
3. The workspace-wide selection, SPLENT_APP in the workspace .env
|
|
75
|
+
(:func:`selected_app`), which product:select writes and every other
|
|
76
|
+
command, agent and release gate reads.
|
|
77
|
+
|
|
78
|
+
The environment carries the first two because the framework and every
|
|
79
|
+
subprocess read the product there too. cli.py loads the workspace .env
|
|
80
|
+
into it before any command runs, never over a variable the process
|
|
81
|
+
already has, so the third is usually there as well; it is read from the
|
|
82
|
+
file here for code the CLI's entry point has not loaded it for.
|
|
83
|
+
``workspace_path`` is the workspace whose .env that is, WORKING_DIR's by
|
|
84
|
+
default.
|
|
85
|
+
|
|
86
|
+
Read the product here, never with os.getenv("SPLENT_APP"), so the rule
|
|
87
|
+
stays in one place.
|
|
88
|
+
"""
|
|
89
|
+
if "SPLENT_APP" in os.environ:
|
|
90
|
+
return os.environ["SPLENT_APP"] or None
|
|
91
|
+
return selected_app(workspace_path)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def selected_app(workspace_path: str | os.PathLike | None = None) -> str | None:
|
|
95
|
+
"""The product the workspace .env selects, or None.
|
|
96
|
+
|
|
97
|
+
The selection product:select writes and product:deselect removes,
|
|
98
|
+
parsed like every other .env reader (quotes, ``export`` and inline
|
|
99
|
+
comments). Not the active product, which an override can change for one
|
|
100
|
+
command (:func:`active_app`).
|
|
101
|
+
"""
|
|
102
|
+
root = Path(workspace_path) if workspace_path else workspace_in_reach()
|
|
103
|
+
env_file = root / ".env" if root else None
|
|
104
|
+
if env_file is None or not env_file.is_file():
|
|
105
|
+
return None
|
|
106
|
+
return (dotenv_values(env_file).get("SPLENT_APP") or "").strip() or None
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def is_override() -> bool:
|
|
110
|
+
"""Whether this command works on another product than the workspace's
|
|
111
|
+
selection: an override, or a command's own option (:func:`active_app`).
|
|
112
|
+
|
|
113
|
+
False in a detached workspace, where there is no selection to keep.
|
|
114
|
+
"""
|
|
115
|
+
selected = selected_app()
|
|
116
|
+
return selected is not None and active_app() != selected
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def use_app(product: str) -> None:
|
|
120
|
+
"""Make PRODUCT the active product of this run: a command's own option.
|
|
121
|
+
|
|
122
|
+
Only this process's environment changes, which is where the framework
|
|
123
|
+
and every subprocess read the product. The workspace .env, the selection
|
|
124
|
+
every other command sees, is left as it is.
|
|
125
|
+
"""
|
|
126
|
+
os.environ["SPLENT_APP"] = product
|
|
62
127
|
|
|
63
128
|
|
|
64
129
|
def is_detached() -> bool:
|
|
@@ -155,7 +220,7 @@ def refuses_production(fn):
|
|
|
155
220
|
def wrapper(*args, **kwargs):
|
|
156
221
|
if normalize_env(os.getenv("SPLENT_ENV")) == "prod":
|
|
157
222
|
name = click.get_current_context().info_name
|
|
158
|
-
app =
|
|
223
|
+
app = active_app() or "the product"
|
|
159
224
|
click.secho(
|
|
160
225
|
f" {name} refuses to run against production: {app} is "
|
|
161
226
|
"deployed, and this would change its database.",
|
|
@@ -192,14 +257,24 @@ def requires_detached(fn):
|
|
|
192
257
|
|
|
193
258
|
@functools.wraps(fn)
|
|
194
259
|
def wrapper(*args, **kwargs):
|
|
195
|
-
|
|
196
|
-
if app:
|
|
197
|
-
click.secho(
|
|
198
|
-
f" A product is currently selected: {app}\n"
|
|
199
|
-
f" Run: splent product:deselect",
|
|
200
|
-
fg="red",
|
|
201
|
-
)
|
|
202
|
-
raise SystemExit(1)
|
|
260
|
+
refuse_active_app()
|
|
203
261
|
return fn(*args, **kwargs)
|
|
204
262
|
|
|
205
263
|
return wrapper
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
def refuse_active_app(alternative: str | None = None) -> None:
|
|
267
|
+
"""Exit when a product is active: the check of :func:`requires_detached`,
|
|
268
|
+
for a command with a flag that skips it (product:create --no-select).
|
|
269
|
+
|
|
270
|
+
``alternative`` is one more line on what to do instead of deselecting.
|
|
271
|
+
"""
|
|
272
|
+
app = active_app()
|
|
273
|
+
if app:
|
|
274
|
+
click.secho(
|
|
275
|
+
f" A product is currently selected: {app}\n Run: splent product:deselect",
|
|
276
|
+
fg="red",
|
|
277
|
+
)
|
|
278
|
+
if alternative:
|
|
279
|
+
click.secho(f" {alternative}", fg="red")
|
|
280
|
+
raise SystemExit(1)
|
|
@@ -56,6 +56,7 @@ from pathlib import Path
|
|
|
56
56
|
|
|
57
57
|
import click
|
|
58
58
|
|
|
59
|
+
from splent_cli.services import context
|
|
59
60
|
from splent_cli.utils.io_utils import atomic_write
|
|
60
61
|
|
|
61
62
|
WORKING_COPY_PREFIX = "splent_spl_"
|
|
@@ -607,8 +608,8 @@ def read_product_pin(workspace: str | os.PathLike, product: str) -> SplPin | Non
|
|
|
607
608
|
|
|
608
609
|
|
|
609
610
|
def active_product_pin(workspace: str | os.PathLike) -> SplPin | None:
|
|
610
|
-
"""The pin of the
|
|
611
|
-
product =
|
|
611
|
+
"""The pin of the active product, when there is one."""
|
|
612
|
+
product = context.active_app()
|
|
612
613
|
if not product:
|
|
613
614
|
return None
|
|
614
615
|
return read_product_pin(workspace, product)
|
|
@@ -75,7 +75,9 @@ def _workspace() -> Path | None:
|
|
|
75
75
|
|
|
76
76
|
|
|
77
77
|
def _product() -> str | None:
|
|
78
|
-
|
|
78
|
+
from splent_cli.services import context
|
|
79
|
+
|
|
80
|
+
product = (context.active_app() or "").strip()
|
|
79
81
|
if not product or "/" in product or "\\" in product or product in (".", ".."):
|
|
80
82
|
return None
|
|
81
83
|
return product
|
|
@@ -27,6 +27,9 @@ load_dotenv()
|
|
|
27
27
|
_app_instance = None
|
|
28
28
|
_module_cache = None
|
|
29
29
|
|
|
30
|
+
# The product of context.active_app, read where the framework reads it: the
|
|
31
|
+
# app is built for the one in the environment, which load_dotenv() above has
|
|
32
|
+
# just filled from the workspace .env unless the process already had one.
|
|
30
33
|
module_name = os.getenv("SPLENT_APP")
|
|
31
34
|
dotenv_path = None
|
|
32
35
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|