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.
Files changed (296) hide show
  1. {splent_cli-1.43.0/src/splent_cli.egg-info → splent_cli-1.44.0}/PKG-INFO +1 -1
  2. {splent_cli-1.43.0 → splent_cli-1.44.0}/pyproject.toml +1 -1
  3. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/cli.py +12 -3
  4. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/check/check_env.py +2 -1
  5. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/clear/clear_uploads.py +2 -2
  6. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/database/db_reset.py +1 -1
  7. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/database/db_rollback.py +1 -1
  8. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/database/db_seed.py +3 -3
  9. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/database/db_upgrade.py +1 -1
  10. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/doctor.py +2 -1
  11. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_release.py +1 -1
  12. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_rename.py +2 -3
  13. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_test.py +3 -3
  14. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_commands.py +2 -4
  15. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_create.py +15 -2
  16. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_list.py +1 -2
  17. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_release.py +1 -2
  18. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_test.py +1 -1
  19. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/uvl/uvl_utils.py +4 -11
  20. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/version.py +1 -1
  21. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/compose.py +10 -1
  22. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/context.py +88 -13
  23. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/spl_store.py +3 -2
  24. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/ci_workflow.py +3 -1
  25. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/dynamic_imports.py +3 -0
  26. {splent_cli-1.43.0 → splent_cli-1.44.0/src/splent_cli.egg-info}/PKG-INFO +1 -1
  27. {splent_cli-1.43.0 → splent_cli-1.44.0}/COPYING +0 -0
  28. {splent_cli-1.43.0 → splent_cli-1.44.0}/COPYING.LESSER +0 -0
  29. {splent_cli-1.43.0 → splent_cli-1.44.0}/README.md +0 -0
  30. {splent_cli-1.43.0 → splent_cli-1.44.0}/setup.cfg +0 -0
  31. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/__init__.py +0 -0
  32. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/__main__.py +0 -0
  33. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/__init__.py +0 -0
  34. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/cache/__init__.py +0 -0
  35. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/cache/cache_clear.py +0 -0
  36. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/cache/cache_orphans.py +0 -0
  37. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/cache/cache_outdated.py +0 -0
  38. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/cache/cache_prune.py +0 -0
  39. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/cache/cache_size.py +0 -0
  40. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/cache/cache_status.py +0 -0
  41. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/cache/cache_usage.py +0 -0
  42. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/cache/cache_versions.py +0 -0
  43. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/check/__init__.py +0 -0
  44. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/check/check_contracts.py +0 -0
  45. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/check/check_deps.py +0 -0
  46. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/check/check_docker.py +0 -0
  47. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/check/check_features.py +0 -0
  48. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/check/check_github.py +0 -0
  49. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/check/check_infra.py +0 -0
  50. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/check/check_product.py +0 -0
  51. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/check/check_pypi.py +0 -0
  52. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/check/check_pyproject.py +0 -0
  53. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/check/check_releases.py +0 -0
  54. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/check/check_vendor.py +0 -0
  55. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/clear/__init__.py +0 -0
  56. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/clear/clear_build.py +0 -0
  57. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/clear/clear_log.py +0 -0
  58. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/command/__init__.py +0 -0
  59. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/command/command_create.py +0 -0
  60. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/coverage.py +0 -0
  61. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/database/db_console.py +0 -0
  62. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/database/db_dump.py +0 -0
  63. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/database/db_migrate.py +0 -0
  64. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/database/db_restore.py +0 -0
  65. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/database/db_status.py +0 -0
  66. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/env/env_list.py +0 -0
  67. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/env/env_set.py +0 -0
  68. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/env/env_show.py +0 -0
  69. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/export/__init__.py +0 -0
  70. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/export/export_puml.py +0 -0
  71. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_add.py +0 -0
  72. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_attach.py +0 -0
  73. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_clean.py +0 -0
  74. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_clone.py +0 -0
  75. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_compat.py +0 -0
  76. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_compile.py +0 -0
  77. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_contract.py +0 -0
  78. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_create.py +0 -0
  79. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_delete.py +0 -0
  80. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_detach.py +0 -0
  81. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_discard.py +0 -0
  82. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_drift.py +0 -0
  83. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_env.py +0 -0
  84. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_fork.py +0 -0
  85. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_git.py +0 -0
  86. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_hook_add.py +0 -0
  87. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_hook_remove.py +0 -0
  88. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_hooks.py +0 -0
  89. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_impact.py +0 -0
  90. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_info.py +0 -0
  91. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_inject_config.py +0 -0
  92. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_install.py +0 -0
  93. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_list.py +0 -0
  94. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_order.py +0 -0
  95. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_outdated.py +0 -0
  96. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_pin.py +0 -0
  97. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_pip_install.py +0 -0
  98. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_pull.py +0 -0
  99. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_refine.py +0 -0
  100. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_remove.py +0 -0
  101. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_search.py +0 -0
  102. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_status.py +0 -0
  103. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_sync_template.py +0 -0
  104. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_translate.py +0 -0
  105. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_unlock.py +0 -0
  106. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_upgrade.py +0 -0
  107. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_versions.py +0 -0
  108. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/feature/feature_xray.py +0 -0
  109. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/lint.py +0 -0
  110. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/locust.py +0 -0
  111. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/marketplace/login.py +0 -0
  112. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/marketplace/logout.py +0 -0
  113. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/marketplace/marketplace_auth_utils.py +0 -0
  114. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/marketplace/marketplace_index.py +0 -0
  115. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/marketplace/whoami.py +0 -0
  116. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/__init__.py +0 -0
  117. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_auto_require.py +0 -0
  118. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_build.py +0 -0
  119. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_clean.py +0 -0
  120. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_config.py +0 -0
  121. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_configure.py +0 -0
  122. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_console.py +0 -0
  123. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_containers.py +0 -0
  124. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_deploy.py +0 -0
  125. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_derive.py +0 -0
  126. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_deselect.py +0 -0
  127. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_down.py +0 -0
  128. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_drift.py +0 -0
  129. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_env.py +0 -0
  130. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_logs.py +0 -0
  131. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_missing.py +0 -0
  132. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_params.py +0 -0
  133. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_port.py +0 -0
  134. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_resolve.py +0 -0
  135. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_restart.py +0 -0
  136. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_routes.py +0 -0
  137. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_run.py +0 -0
  138. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_select.py +0 -0
  139. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_shell.py +0 -0
  140. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_signals.py +0 -0
  141. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_sync_template.py +0 -0
  142. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_up.py +0 -0
  143. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/product/product_validate.py +0 -0
  144. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/release/__init__.py +0 -0
  145. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/release/release_core.py +0 -0
  146. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/release/release_resume.py +0 -0
  147. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/selenium.py +0 -0
  148. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/spl/__init__.py +0 -0
  149. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/spl/spl_add_constraints.py +0 -0
  150. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/spl/spl_add_feature.py +0 -0
  151. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/spl/spl_compare.py +0 -0
  152. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/spl/spl_configurations.py +0 -0
  153. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/spl/spl_create.py +0 -0
  154. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/spl/spl_deps.py +0 -0
  155. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/spl/spl_features.py +0 -0
  156. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/spl/spl_fetch.py +0 -0
  157. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/spl/spl_info.py +0 -0
  158. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/spl/spl_list.py +0 -0
  159. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/spl/spl_outdated.py +0 -0
  160. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/spl/spl_pin.py +0 -0
  161. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/spl/spl_publish.py +0 -0
  162. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/spl/spl_remove_feature.py +0 -0
  163. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/spl/spl_utils.py +0 -0
  164. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/commands/tokens_setup.py +0 -0
  165. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/__init__.py +0 -0
  166. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/credentials.py +0 -0
  167. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/deploy_bundle.py +0 -0
  168. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/image_registry.py +0 -0
  169. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/index_refresh.py +0 -0
  170. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/marketplace.py +0 -0
  171. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/marketplace_api.py +0 -0
  172. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/marketplace_url.py +0 -0
  173. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/neutral_app.py +0 -0
  174. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/own_commands.py +0 -0
  175. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/preflight.py +0 -0
  176. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/pypi_quota.py +0 -0
  177. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/registry.py +0 -0
  178. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/release.py +0 -0
  179. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/release_dry_run.py +0 -0
  180. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/release_gate.py +0 -0
  181. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/services/web_container.py +0 -0
  182. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_.gitignore.j2 +0 -0
  183. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_MANIFEST.in.j2 +0 -0
  184. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_README.md.j2 +0 -0
  185. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_commands.py.j2 +0 -0
  186. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_config.py.j2 +0 -0
  187. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_docker-compose.dev.yml.j2 +0 -0
  188. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_docker-compose.prod.yml.j2 +0 -0
  189. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_docker.env.example.j2 +0 -0
  190. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_forms.py.j2 +0 -0
  191. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_hooks.py.j2 +0 -0
  192. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_init.py.j2 +0 -0
  193. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_init_config.py.j2 +0 -0
  194. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_init_light.py.j2 +0 -0
  195. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_init_service.py.j2 +0 -0
  196. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_migrations_alembic.ini.j2 +0 -0
  197. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_migrations_env.py.j2 +0 -0
  198. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_migrations_script.py.mako.j2 +0 -0
  199. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_models.py.j2 +0 -0
  200. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_pyproject.toml.j2 +0 -0
  201. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_pyproject_minimal.toml.j2 +0 -0
  202. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_repositories.py.j2 +0 -0
  203. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_routes.py.j2 +0 -0
  204. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_scripts.js.j2 +0 -0
  205. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_seeders.py.j2 +0 -0
  206. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_services.py.j2 +0 -0
  207. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_services_service.py.j2 +0 -0
  208. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_signals.py.j2 +0 -0
  209. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_templates_index.html.j2 +0 -0
  210. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_tests_conftest.py.j2 +0 -0
  211. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_tests_e2e.py.j2 +0 -0
  212. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_tests_functional.py.j2 +0 -0
  213. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_tests_integration.py.j2 +0 -0
  214. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_tests_locustfile.py.j2 +0 -0
  215. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_tests_unit.py.j2 +0 -0
  216. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/feature/feature_webpack.config.js.j2 +0 -0
  217. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/licenses/COPYING +0 -0
  218. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/licenses/COPYING.LESSER +0 -0
  219. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_.env.dev.example.j2 +0 -0
  220. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_.env.prod.example.j2 +0 -0
  221. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_.gitignore.j2 +0 -0
  222. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_00_core_requirements_dev.sh.j2 +0 -0
  223. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_00_install_features.sh.j2 +0 -0
  224. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_01_compile_assets.sh.j2 +0 -0
  225. {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
  226. {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
  227. {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
  228. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_03_initialize_migrations.sh.j2 +0 -0
  229. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_04_handle_migrations.sh.j2 +0 -0
  230. {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
  231. {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
  232. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_400.html +0 -0
  233. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_401.html +0 -0
  234. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_404.html +0 -0
  235. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_500.html +0 -0
  236. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_Dockerfile.dev.dockerignore.j2 +0 -0
  237. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_Dockerfile.dev.j2 +0 -0
  238. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_Dockerfile.prod.dockerignore.j2 +0 -0
  239. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_Dockerfile.prod.j2 +0 -0
  240. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_README.md.j2 +0 -0
  241. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_app.css +0 -0
  242. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_app.js +0 -0
  243. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_base_template.html +0 -0
  244. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_ci_upgrade.yml.j2 +0 -0
  245. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_ci_validate.yml.j2 +0 -0
  246. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_config.py.j2 +0 -0
  247. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_docker-compose.dev.yml.j2 +0 -0
  248. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_docker-compose.prod.yml.j2 +0 -0
  249. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_dropzone.css +0 -0
  250. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_entrypoint.dev.sh.j2 +0 -0
  251. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_entrypoint.prod.sh.j2 +0 -0
  252. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_errors.py.j2 +0 -0
  253. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_favicon.svg +0 -0
  254. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_init.py.j2 +0 -0
  255. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_logging.py.j2 +0 -0
  256. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_own.css +0 -0
  257. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_package.json.j2 +0 -0
  258. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_pyproject.toml.j2 +0 -0
  259. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/templates/product/product_uvl.j2 +0 -0
  260. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/__init__.py +0 -0
  261. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/archetype.py +0 -0
  262. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/cache_utils.py +0 -0
  263. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/ci_services.py +0 -0
  264. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/command_loader.py +0 -0
  265. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/contract_freshness.py +0 -0
  266. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/db_client.py +0 -0
  267. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/db_utils.py +0 -0
  268. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/decorators.py +0 -0
  269. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/feature_installer.py +0 -0
  270. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/feature_naming.py +0 -0
  271. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/feature_params.py +0 -0
  272. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/feature_requirements.py +0 -0
  273. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/feature_resolution.py +0 -0
  274. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/feature_utils.py +0 -0
  275. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/forge.py +0 -0
  276. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/git_url.py +0 -0
  277. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/integrity.py +0 -0
  278. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/io_utils.py +0 -0
  279. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/lifecycle.py +0 -0
  280. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/manifest.py +0 -0
  281. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/menu_keys.py +0 -0
  282. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/migration_lock.py +0 -0
  283. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/path_utils.py +0 -0
  284. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/proc.py +0 -0
  285. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/redact.py +0 -0
  286. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/refinement_facts.py +0 -0
  287. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/running_version.py +0 -0
  288. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/template_drift.py +0 -0
  289. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/toml_edit.py +0 -0
  290. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/upgrade_plan.py +0 -0
  291. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli/utils/uvl_params.py +0 -0
  292. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli.egg-info/SOURCES.txt +0 -0
  293. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli.egg-info/dependency_links.txt +0 -0
  294. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli.egg-info/entry_points.txt +0 -0
  295. {splent_cli-1.43.0 → splent_cli-1.44.0}/src/splent_cli.egg-info/requires.txt +0 -0
  296. {splent_cli-1.43.0 → splent_cli-1.44.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.43.0
3
+ Version: 1.44.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
  License-Expression: LGPL-3.0-or-later
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "splent_cli"
7
- version = "1.43.0"
7
+ version = "1.44.0"
8
8
  description = "SPLENT-CLI is a CLI to be able to work on your development more easily."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13"
@@ -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
- os.getenv("SPLENT_APP"), set(self.commands)
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 = os.getenv("SPLENT_APP")
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 = os.getenv("SPLENT_APP", "The 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 = os.getenv("SPLENT_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 = os.getenv("SPLENT_APP", "")
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(os.getenv("SPLENT_APP", ""), env, yes)
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 = os.getenv("SPLENT_APP", "")
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 = os.getenv("SPLENT_APP", "")
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 = os.getenv("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 = os.getenv("SPLENT_APP", "")
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 os.getenv("SPLENT_APP", "") in targets:
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 = os.getenv("SPLENT_APP", "")
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 = os.getenv("SPLENT_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 = os.getenv("SPLENT_APP") or None
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
- splent_app = os.getenv(
100
- "SPLENT_APP"
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 os.getenv("SPLENT_APP", "")
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 == os.getenv("SPLENT_APP")
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 = os.getenv("SPLENT_APP", "")
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(os.getenv("SPLENT_APP"), set(cli.commands))
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 = os.getenv("SPLENT_APP", "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
- @context.requires_detached
134
- def make_product(name, spl_name, spl_doi, features_file, force):
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 = os.getenv("SPLENT_APP")
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 os.getenv("SPLENT_APP")
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
- os.environ["SPLENT_APP"] = product
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
- """Read SPLENT_APP from env var or workspace .env and validate the product directory exists."""
44
- # Prefer environment variable (set by product:select or passed via -e)
45
- app_name = os.getenv("SPLENT_APP")
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 = os.getenv("SPLENT_APP")
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 = os.getenv("SPLENT_APP")
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
- """Return SPLENT_APP or None if not set (no error)."""
61
- return os.getenv("SPLENT_APP") or None
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 = os.getenv("SPLENT_APP") or "the product"
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
- app = active_app()
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 selected product, when one is selected."""
611
- product = os.getenv("SPLENT_APP")
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
- product = os.getenv("SPLENT_APP", "").strip()
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
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: splent_cli
3
- Version: 1.43.0
3
+ Version: 1.44.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
  License-Expression: LGPL-3.0-or-later
File without changes
File without changes
File without changes
File without changes