splent-cli 1.51.0__tar.gz → 1.53.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 (323) hide show
  1. {splent_cli-1.51.0/src/splent_cli.egg-info → splent_cli-1.53.0}/PKG-INFO +1 -1
  2. {splent_cli-1.51.0 → splent_cli-1.53.0}/pyproject.toml +1 -1
  3. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_release.py +11 -12
  4. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/release/release_resume.py +15 -1
  5. splent_cli-1.53.0/src/splent_cli/services/release_workspace.py +223 -0
  6. {splent_cli-1.51.0 → splent_cli-1.53.0/src/splent_cli.egg-info}/PKG-INFO +1 -1
  7. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli.egg-info/SOURCES.txt +1 -0
  8. {splent_cli-1.51.0 → splent_cli-1.53.0}/COPYING +0 -0
  9. {splent_cli-1.51.0 → splent_cli-1.53.0}/COPYING.LESSER +0 -0
  10. {splent_cli-1.51.0 → splent_cli-1.53.0}/README.md +0 -0
  11. {splent_cli-1.51.0 → splent_cli-1.53.0}/setup.cfg +0 -0
  12. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/__init__.py +0 -0
  13. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/__main__.py +0 -0
  14. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/cli.py +0 -0
  15. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/__init__.py +0 -0
  16. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/cache/__init__.py +0 -0
  17. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/cache/cache_clear.py +0 -0
  18. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/cache/cache_orphans.py +0 -0
  19. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/cache/cache_outdated.py +0 -0
  20. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/cache/cache_prune.py +0 -0
  21. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/cache/cache_size.py +0 -0
  22. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/cache/cache_status.py +0 -0
  23. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/cache/cache_usage.py +0 -0
  24. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/cache/cache_versions.py +0 -0
  25. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/check/__init__.py +0 -0
  26. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/check/check_contracts.py +0 -0
  27. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/check/check_deps.py +0 -0
  28. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/check/check_docker.py +0 -0
  29. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/check/check_env.py +0 -0
  30. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/check/check_features.py +0 -0
  31. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/check/check_github.py +0 -0
  32. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/check/check_infra.py +0 -0
  33. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/check/check_product.py +0 -0
  34. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/check/check_pypi.py +0 -0
  35. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/check/check_pyproject.py +0 -0
  36. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/check/check_releases.py +0 -0
  37. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/check/check_vendor.py +0 -0
  38. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/clear/__init__.py +0 -0
  39. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/clear/clear_build.py +0 -0
  40. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/clear/clear_log.py +0 -0
  41. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/clear/clear_uploads.py +0 -0
  42. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/command/__init__.py +0 -0
  43. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/command/command_create.py +0 -0
  44. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/coverage.py +0 -0
  45. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/database/db_console.py +0 -0
  46. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/database/db_dump.py +0 -0
  47. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/database/db_migrate.py +0 -0
  48. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/database/db_reset.py +0 -0
  49. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/database/db_restore.py +0 -0
  50. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/database/db_rollback.py +0 -0
  51. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/database/db_seed.py +0 -0
  52. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/database/db_status.py +0 -0
  53. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/database/db_upgrade.py +0 -0
  54. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/doctor.py +0 -0
  55. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/env/env_list.py +0 -0
  56. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/env/env_set.py +0 -0
  57. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/env/env_show.py +0 -0
  58. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/export/__init__.py +0 -0
  59. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/export/export_puml.py +0 -0
  60. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_add.py +0 -0
  61. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_attach.py +0 -0
  62. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_clean.py +0 -0
  63. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_clone.py +0 -0
  64. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_compat.py +0 -0
  65. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_compile.py +0 -0
  66. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_contract.py +0 -0
  67. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_create.py +0 -0
  68. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_delete.py +0 -0
  69. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_detach.py +0 -0
  70. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_discard.py +0 -0
  71. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_drift.py +0 -0
  72. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_env.py +0 -0
  73. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_fork.py +0 -0
  74. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_frontend_init.py +0 -0
  75. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_git.py +0 -0
  76. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_hook_add.py +0 -0
  77. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_hook_remove.py +0 -0
  78. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_hooks.py +0 -0
  79. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_impact.py +0 -0
  80. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_info.py +0 -0
  81. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_inject_config.py +0 -0
  82. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_install.py +0 -0
  83. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_list.py +0 -0
  84. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_npm.py +0 -0
  85. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_order.py +0 -0
  86. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_outdated.py +0 -0
  87. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_pin.py +0 -0
  88. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_pip_install.py +0 -0
  89. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_pull.py +0 -0
  90. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_refine.py +0 -0
  91. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_release.py +0 -0
  92. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_remove.py +0 -0
  93. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_rename.py +0 -0
  94. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_search.py +0 -0
  95. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_security.py +0 -0
  96. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_status.py +0 -0
  97. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_sync_template.py +0 -0
  98. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_test.py +0 -0
  99. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_translate.py +0 -0
  100. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_unlock.py +0 -0
  101. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_upgrade.py +0 -0
  102. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_versions.py +0 -0
  103. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/feature/feature_xray.py +0 -0
  104. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/lint.py +0 -0
  105. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/locust.py +0 -0
  106. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/marketplace/login.py +0 -0
  107. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/marketplace/logout.py +0 -0
  108. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/marketplace/marketplace_auth_utils.py +0 -0
  109. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/marketplace/marketplace_index.py +0 -0
  110. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/marketplace/whoami.py +0 -0
  111. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/__init__.py +0 -0
  112. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_auto_require.py +0 -0
  113. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_build.py +0 -0
  114. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_clean.py +0 -0
  115. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_commands.py +0 -0
  116. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_config.py +0 -0
  117. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_configure.py +0 -0
  118. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_console.py +0 -0
  119. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_containers.py +0 -0
  120. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_create.py +0 -0
  121. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_deploy.py +0 -0
  122. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_derive.py +0 -0
  123. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_deselect.py +0 -0
  124. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_down.py +0 -0
  125. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_drift.py +0 -0
  126. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_env.py +0 -0
  127. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_frontend_audit.py +0 -0
  128. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_list.py +0 -0
  129. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_logs.py +0 -0
  130. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_missing.py +0 -0
  131. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_params.py +0 -0
  132. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_port.py +0 -0
  133. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_resolve.py +0 -0
  134. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_restart.py +0 -0
  135. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_routes.py +0 -0
  136. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_run.py +0 -0
  137. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_select.py +0 -0
  138. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_shell.py +0 -0
  139. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_signals.py +0 -0
  140. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_sync_template.py +0 -0
  141. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_test.py +0 -0
  142. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_up.py +0 -0
  143. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/product/product_validate.py +0 -0
  144. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/release/__init__.py +0 -0
  145. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/release/release_core.py +0 -0
  146. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/selenium.py +0 -0
  147. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/spl/__init__.py +0 -0
  148. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/spl/spl_add_constraints.py +0 -0
  149. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/spl/spl_add_feature.py +0 -0
  150. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/spl/spl_compare.py +0 -0
  151. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/spl/spl_configurations.py +0 -0
  152. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/spl/spl_create.py +0 -0
  153. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/spl/spl_deps.py +0 -0
  154. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/spl/spl_features.py +0 -0
  155. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/spl/spl_fetch.py +0 -0
  156. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/spl/spl_info.py +0 -0
  157. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/spl/spl_list.py +0 -0
  158. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/spl/spl_outdated.py +0 -0
  159. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/spl/spl_pin.py +0 -0
  160. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/spl/spl_publish.py +0 -0
  161. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/spl/spl_remove_feature.py +0 -0
  162. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/spl/spl_utils.py +0 -0
  163. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/storage/__init__.py +0 -0
  164. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/storage/storage_migrate.py +0 -0
  165. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/tokens_setup.py +0 -0
  166. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/uvl/uvl_utils.py +0 -0
  167. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/commands/version.py +0 -0
  168. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/__init__.py +0 -0
  169. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/compose.py +0 -0
  170. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/context.py +0 -0
  171. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/credentials.py +0 -0
  172. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/deploy_bundle.py +0 -0
  173. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/editable_refresh.py +0 -0
  174. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/frontend.py +0 -0
  175. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/image_registry.py +0 -0
  176. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/index_refresh.py +0 -0
  177. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/marketplace.py +0 -0
  178. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/marketplace_api.py +0 -0
  179. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/marketplace_url.py +0 -0
  180. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/neutral_app.py +0 -0
  181. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/own_commands.py +0 -0
  182. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/preflight.py +0 -0
  183. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/pypi_quota.py +0 -0
  184. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/registry.py +0 -0
  185. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/release.py +0 -0
  186. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/release_dry_run.py +0 -0
  187. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/release_gate.py +0 -0
  188. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/security_scan.py +0 -0
  189. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/source_mirror.py +0 -0
  190. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/spl_store.py +0 -0
  191. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/services/web_container.py +0 -0
  192. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_.gitignore.j2 +0 -0
  193. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_MANIFEST.in.j2 +0 -0
  194. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_README.md.j2 +0 -0
  195. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_commands.py.j2 +0 -0
  196. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_config.py.j2 +0 -0
  197. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_docker-compose.dev.yml.j2 +0 -0
  198. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_docker-compose.prod.yml.j2 +0 -0
  199. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_docker.env.example.j2 +0 -0
  200. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_forms.py.j2 +0 -0
  201. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_frontend.npmrc.j2 +0 -0
  202. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_frontend_scripts.js.j2 +0 -0
  203. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_hooks.py.j2 +0 -0
  204. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_init.py.j2 +0 -0
  205. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_init_config.py.j2 +0 -0
  206. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_init_light.py.j2 +0 -0
  207. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_init_service.py.j2 +0 -0
  208. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_migrations_alembic.ini.j2 +0 -0
  209. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_migrations_env.py.j2 +0 -0
  210. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_migrations_script.py.mako.j2 +0 -0
  211. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_models.py.j2 +0 -0
  212. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_pyproject.toml.j2 +0 -0
  213. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_pyproject_minimal.toml.j2 +0 -0
  214. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_repositories.py.j2 +0 -0
  215. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_routes.py.j2 +0 -0
  216. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_scripts.js.j2 +0 -0
  217. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_seeders.py.j2 +0 -0
  218. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_services.py.j2 +0 -0
  219. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_services_service.py.j2 +0 -0
  220. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_signals.py.j2 +0 -0
  221. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_templates_index.html.j2 +0 -0
  222. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_tests_conftest.py.j2 +0 -0
  223. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_tests_e2e.py.j2 +0 -0
  224. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_tests_functional.py.j2 +0 -0
  225. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_tests_integration.py.j2 +0 -0
  226. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_tests_locustfile.py.j2 +0 -0
  227. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_tests_unit.py.j2 +0 -0
  228. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/feature/feature_webpack.config.js.j2 +0 -0
  229. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/licenses/COPYING +0 -0
  230. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/licenses/COPYING.LESSER +0 -0
  231. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_.env.dev.example.j2 +0 -0
  232. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_.env.prod.example.j2 +0 -0
  233. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_.gitignore.j2 +0 -0
  234. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_00_core_requirements_dev.sh.j2 +0 -0
  235. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_00_install_features.sh.j2 +0 -0
  236. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_01_compile_assets.sh.j2 +0 -0
  237. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_02_0_db_wait_connection.sh.j2 +0 -0
  238. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_02_1_db_create_db_test.sh.j2 +0 -0
  239. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_02_2_db_create_splent_migrations.sh.j2 +0 -0
  240. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_03_initialize_migrations.sh.j2 +0 -0
  241. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_04_handle_migrations.sh.j2 +0 -0
  242. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_05_0_start_app_dev.sh.j2 +0 -0
  243. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_05_1_start_app_prod.sh.j2 +0 -0
  244. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_400.html +0 -0
  245. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_401.html +0 -0
  246. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_404.html +0 -0
  247. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_500.html +0 -0
  248. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_Dockerfile.dev.dockerignore.j2 +0 -0
  249. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_Dockerfile.dev.j2 +0 -0
  250. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_Dockerfile.prod.dockerignore.j2 +0 -0
  251. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_Dockerfile.prod.j2 +0 -0
  252. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_README.md.j2 +0 -0
  253. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_app.css +0 -0
  254. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_app.js +0 -0
  255. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_base_template.html +0 -0
  256. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_ci_upgrade.yml.j2 +0 -0
  257. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_ci_validate.yml.j2 +0 -0
  258. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_config.py.j2 +0 -0
  259. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_docker-compose.dev.yml.j2 +0 -0
  260. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_docker-compose.prod.yml.j2 +0 -0
  261. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_dropzone.css +0 -0
  262. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_entrypoint.dev.sh.j2 +0 -0
  263. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_entrypoint.prod.sh.j2 +0 -0
  264. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_errors.py.j2 +0 -0
  265. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_favicon.svg +0 -0
  266. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_init.py.j2 +0 -0
  267. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_logging.py.j2 +0 -0
  268. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_own.css +0 -0
  269. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_package.json.j2 +0 -0
  270. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_pyproject.toml.j2 +0 -0
  271. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/templates/product/product_uvl.j2 +0 -0
  272. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/toolchain/Dockerfile.frontend +0 -0
  273. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/toolchain/frontend/package-lock.json +0 -0
  274. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/toolchain/frontend/package.json +0 -0
  275. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/toolchain/frontend/splent/build.js +0 -0
  276. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/toolchain/frontend/splent/legacy.js +0 -0
  277. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/toolchain/frontend/splent/lint.js +0 -0
  278. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/toolchain/frontend/splent/plugin.js +0 -0
  279. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/toolchain/frontend/splent/preset.js +0 -0
  280. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/toolchain/frontend/splent/singletons.json +0 -0
  281. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/__init__.py +0 -0
  282. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/archetype.py +0 -0
  283. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/cache_utils.py +0 -0
  284. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/ci_services.py +0 -0
  285. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/ci_workflow.py +0 -0
  286. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/command_loader.py +0 -0
  287. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/contract_freshness.py +0 -0
  288. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/db_client.py +0 -0
  289. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/db_utils.py +0 -0
  290. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/decorators.py +0 -0
  291. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/deploy_freshness.py +0 -0
  292. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/dynamic_imports.py +0 -0
  293. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/feature_installer.py +0 -0
  294. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/feature_naming.py +0 -0
  295. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/feature_params.py +0 -0
  296. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/feature_requirements.py +0 -0
  297. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/feature_resolution.py +0 -0
  298. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/feature_utils.py +0 -0
  299. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/forge.py +0 -0
  300. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/frontend_check.py +0 -0
  301. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/frontend_licenses.py +0 -0
  302. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/git_url.py +0 -0
  303. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/integrity.py +0 -0
  304. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/io_utils.py +0 -0
  305. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/lifecycle.py +0 -0
  306. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/manifest.py +0 -0
  307. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/menu_keys.py +0 -0
  308. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/migration_lock.py +0 -0
  309. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/npm_semver.py +0 -0
  310. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/path_utils.py +0 -0
  311. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/proc.py +0 -0
  312. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/redact.py +0 -0
  313. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/refinement_facts.py +0 -0
  314. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/running_version.py +0 -0
  315. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/template_drift.py +0 -0
  316. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/toml_edit.py +0 -0
  317. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/upgrade_plan.py +0 -0
  318. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/uvl_diagnosis.py +0 -0
  319. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli/utils/uvl_params.py +0 -0
  320. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli.egg-info/dependency_links.txt +0 -0
  321. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli.egg-info/entry_points.txt +0 -0
  322. {splent_cli-1.51.0 → splent_cli-1.53.0}/src/splent_cli.egg-info/requires.txt +0 -0
  323. {splent_cli-1.51.0 → splent_cli-1.53.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.51.0
3
+ Version: 1.53.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.51.0"
7
+ version = "1.53.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"
@@ -6,6 +6,7 @@ import contextlib
6
6
  import json
7
7
  import os
8
8
  import subprocess
9
+ import sys
9
10
  import tempfile
10
11
 
11
12
  import click
@@ -28,6 +29,7 @@ from splent_cli.services import (
28
29
  image_registry,
29
30
  release,
30
31
  release_gate,
32
+ release_workspace,
31
33
  source_mirror,
32
34
  )
33
35
  from splent_cli.utils.proc import run, require_docker
@@ -40,19 +42,9 @@ def _guard_all_features_pinned(product_path: str):
40
42
  features_prod declare, so an editable entry in any of them makes the
41
43
  release irreproducible, not only one in the base list.
42
44
  """
43
- from splent_cli.utils.feature_utils import (
44
- FEATURE_LIST_KEYS,
45
- load_product_pyproject,
46
- read_feature_list,
47
- )
45
+ from splent_cli.utils.feature_utils import load_product_pyproject
48
46
 
49
- data = load_product_pyproject(product_path)
50
- editable = [
51
- (key, entry)
52
- for key in FEATURE_LIST_KEYS
53
- for entry in read_feature_list(data, key)
54
- if "@" not in entry
55
- ]
47
+ editable = release_workspace.editable_features(load_product_pyproject(product_path))
56
48
  if not editable:
57
49
  return
58
50
 
@@ -427,6 +419,13 @@ def product_release(
427
419
  click.secho(f" error: pyproject.toml not found in {product}", fg="red")
428
420
  raise SystemExit(1)
429
421
 
422
+ if release_workspace.in_development_mode(product_path):
423
+ raise SystemExit(
424
+ release_workspace.run_from_head(
425
+ product, product_path, str(context.workspace()), sys.argv[1:]
426
+ )
427
+ )
428
+
430
429
  _guard_all_features_pinned(product_path)
431
430
  _guard_deployable(str(context.workspace()), product, product_path)
432
431
  mirror = None if no_mirror else _declared_source_mirror(product_path)
@@ -33,11 +33,18 @@ import contextlib
33
33
  import os
34
34
  import shutil
35
35
  import subprocess
36
+ import sys
36
37
  import tempfile
37
38
 
38
39
  import click
39
40
 
40
- from splent_cli.services import context, release, release_gate, source_mirror
41
+ from splent_cli.services import (
42
+ context,
43
+ release,
44
+ release_gate,
45
+ release_workspace,
46
+ source_mirror,
47
+ )
41
48
  from splent_cli.utils import forge
42
49
  from splent_cli.utils.git_url import _non_interactive_env
43
50
 
@@ -322,6 +329,13 @@ def release_resume(target, assume_yes, no_pypi, no_forge, no_github, no_docker,
322
329
  no_forge = release.no_forge_requested(no_forge, no_github)
323
330
  workspace = str(context.workspace())
324
331
  path, label, kind = resolve_target(target, workspace)
332
+ if kind == "product" and release_workspace.in_development_mode(path):
333
+ raise SystemExit(
334
+ release_workspace.run_from_head(
335
+ os.path.basename(path), path, workspace, sys.argv[1:]
336
+ )
337
+ )
338
+
325
339
  # What the hints this run prints tell the operator to run next. A withheld
326
340
  # image stays withheld.
327
341
  hint_target = f"{target} --no-docker" if no_docker else target
@@ -0,0 +1,223 @@
1
+ """Releasing what HEAD holds while the checkout is in development mode.
2
+
3
+ A product under development lists its features without a version in
4
+ pyproject.toml, uncommitted, so the app mounts their working copies. HEAD keeps
5
+ them pinned. Such a checkout cannot release as it is, and it should not have to
6
+ change either: a release is what is committed.
7
+
8
+ So product:release and release:resume run from a temporary workspace of their
9
+ own, a worktree of HEAD next to the cache and the product line's model, and the
10
+ checkout moves forward afterwards with its pyproject.toml as it was, bar what
11
+ the release changed in it.
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import glob
17
+ import os
18
+ import shutil
19
+ import subprocess
20
+ import sys
21
+ import tempfile
22
+ import tomllib
23
+
24
+ import click
25
+
26
+ from splent_cli.utils.feature_utils import (
27
+ FEATURE_LIST_KEYS,
28
+ load_product_pyproject,
29
+ read_feature_list,
30
+ )
31
+
32
+ PYPROJECT = "pyproject.toml"
33
+
34
+
35
+ def editable_features(data: dict) -> list[tuple[str, str]]:
36
+ """``(list, entry)`` of every feature of a pyproject with no version pinned.
37
+
38
+ Every list counts. A release runs whatever features, features_dev and
39
+ features_prod declare.
40
+ """
41
+ return [
42
+ (key, entry)
43
+ for key in FEATURE_LIST_KEYS
44
+ for entry in read_feature_list(data, key)
45
+ if "@" not in entry
46
+ ]
47
+
48
+
49
+ def _git(path: str, *args: str) -> subprocess.CompletedProcess:
50
+ return subprocess.run(["git", *args], cwd=path, capture_output=True, text=True)
51
+
52
+
53
+ def in_development_mode(product_path: str) -> bool:
54
+ """Whether the checkout has editable features and HEAD has none."""
55
+ if not editable_features(load_product_pyproject(product_path)):
56
+ return False
57
+ head = _git(product_path, "show", f"HEAD:{PYPROJECT}")
58
+ if head.returncode != 0:
59
+ return False
60
+ try:
61
+ return not editable_features(tomllib.loads(head.stdout))
62
+ except tomllib.TOMLDecodeError:
63
+ return False
64
+
65
+
66
+ def _only_in_checkout(work: dict, head: dict, path: str = "") -> list[str]:
67
+ """What the checkout's pyproject.toml says that HEAD does not, pins aside."""
68
+ found = []
69
+ for key, value in work.items():
70
+ where = f"{path}.{key}" if path else key
71
+ if path == "tool.splent" and key in FEATURE_LIST_KEYS:
72
+ continue
73
+ if key not in head:
74
+ found.append(where)
75
+ elif isinstance(value, dict) and isinstance(head[key], dict):
76
+ found.extend(_only_in_checkout(value, head[key], where))
77
+ elif value != head[key]:
78
+ found.append(where)
79
+ return found
80
+
81
+
82
+ def settings_left_out(product_path: str) -> list[str]:
83
+ """The settings of the checkout's pyproject.toml this release will not carry.
84
+
85
+ The feature lists are what development mode changes on purpose. Anything
86
+ else there holds in development and not in production, without a word:
87
+ that is how a product kept serving a page its pyproject.toml turned off.
88
+ """
89
+ head = _git(product_path, "show", f"HEAD:{PYPROJECT}")
90
+ try:
91
+ return _only_in_checkout(
92
+ load_product_pyproject(product_path), tomllib.loads(head.stdout)
93
+ )
94
+ except tomllib.TOMLDecodeError:
95
+ return []
96
+
97
+
98
+ def _splent(args: list[str], env: dict) -> int:
99
+ """Run the CLI in the temporary workspace, in this terminal."""
100
+ return subprocess.run(
101
+ [sys.executable, "-m", "splent_cli", *args], env=env
102
+ ).returncode
103
+
104
+
105
+ def _merged_pyproject(path: str, ours: str, base: str, theirs: str) -> str | None:
106
+ """Three-way merge of the checkout's pyproject.toml, None on a conflict."""
107
+ with tempfile.TemporaryDirectory(prefix="splent_pyproject_") as tmp:
108
+ names = []
109
+ for name, content in (("ours", ours), ("base", base), ("theirs", theirs)):
110
+ names.append(os.path.join(tmp, name))
111
+ with open(names[-1], "w", encoding="utf-8") as f:
112
+ f.write(content)
113
+ merged = _git(path, "merge-file", "-p", *names)
114
+ return merged.stdout if merged.returncode == 0 else None
115
+
116
+
117
+ def _bring_checkout_forward(product_path: str, start: str, end: str) -> None:
118
+ """Move the checkout to *end*, its development pyproject.toml kept.
119
+
120
+ Says so when it cannot, and leaves the checkout exactly as it found it.
121
+ """
122
+ hint = f"Your checkout stays where it was. When it can, run git merge --ff-only {end[:12]}."
123
+ if _git(product_path, "rev-parse", "HEAD").stdout.strip() != start:
124
+ click.secho(f" checkout HEAD moved during the release. {hint}", fg="yellow")
125
+ return
126
+ pyproject = os.path.join(product_path, PYPROJECT)
127
+ with open(pyproject, encoding="utf-8") as f:
128
+ ours = f.read()
129
+ merged = _merged_pyproject(
130
+ product_path,
131
+ ours,
132
+ _git(product_path, "show", f"{start}:{PYPROJECT}").stdout,
133
+ _git(product_path, "show", f"{end}:{PYPROJECT}").stdout,
134
+ )
135
+ if merged is None:
136
+ click.secho(
137
+ f" checkout your {PYPROJECT} and the release's do not merge. {hint}",
138
+ fg="yellow",
139
+ )
140
+ return
141
+
142
+ result = merged
143
+ moved = False
144
+ try:
145
+ _git(product_path, "checkout", "--", PYPROJECT)
146
+ forward = _git(product_path, "merge", "--ff-only", "--quiet", end)
147
+ moved = forward.returncode == 0
148
+ if not moved:
149
+ result = ours
150
+ click.secho(
151
+ f" checkout {forward.stderr.strip()}\n checkout {hint}", fg="yellow"
152
+ )
153
+ except OSError as e:
154
+ result = ours
155
+ click.secho(f" checkout {e}. {hint}", fg="yellow")
156
+ finally:
157
+ with open(pyproject, "w", encoding="utf-8") as f:
158
+ f.write(result)
159
+ if moved:
160
+ click.echo(f" checkout now at {end[:12]}, your {PYPROJECT} is kept")
161
+
162
+
163
+ def run_from_head(
164
+ product: str, product_path: str, workspace: str, argv: list[str]
165
+ ) -> int:
166
+ """Run this command in a temporary workspace holding HEAD. Its exit code.
167
+
168
+ The checkout ends where a release run in it would have, commit included
169
+ when the command stopped halfway, so release:resume can go on from it.
170
+ """
171
+ start = _git(product_path, "rev-parse", "HEAD").stdout.strip()
172
+ click.secho(
173
+ f" checkout {product} has editable features, so this works from what HEAD "
174
+ f"holds ({start[:12]}).",
175
+ fg="cyan",
176
+ )
177
+ status = _git(product_path, "status", "--porcelain").stdout.splitlines()
178
+ left_out = [line[3:] for line in status if line[3:] != PYPROJECT]
179
+ if left_out:
180
+ click.secho(
181
+ " checkout uncommitted, so left out: "
182
+ + ", ".join(left_out[:5])
183
+ + (" ..." if len(left_out) > 5 else ""),
184
+ fg="yellow",
185
+ )
186
+
187
+ settings = settings_left_out(product_path)
188
+ if settings:
189
+ click.secho(
190
+ f" WARNING your {PYPROJECT} has settings HEAD does not, so this version "
191
+ "goes without them. Commit them if production needs them:",
192
+ fg="yellow",
193
+ bold=True,
194
+ )
195
+ for setting in settings:
196
+ click.secho(f" {setting}", fg="yellow")
197
+
198
+ temporary = tempfile.mkdtemp(prefix="splent_release_")
199
+ worktree = os.path.join(temporary, product)
200
+ try:
201
+ cache = os.path.join(workspace, ".splent_cache")
202
+ for path in [cache, *glob.glob(os.path.join(workspace, "splent_spl_*"))]:
203
+ if os.path.exists(path):
204
+ os.symlink(path, os.path.join(temporary, os.path.basename(path)))
205
+ added = _git(product_path, "worktree", "add", "--detach", worktree, start)
206
+ if added.returncode != 0:
207
+ click.secho(f" error: {added.stderr.strip()}", fg="red")
208
+ return 1
209
+
210
+ env = {**os.environ, "WORKING_DIR": temporary, "SPLENT_APP": product}
211
+ code = _splent(["product:resolve", "--prod", "--strict"], env)
212
+ if code != 0:
213
+ return code
214
+ code = _splent(argv, env)
215
+
216
+ end = _git(worktree, "rev-parse", "HEAD").stdout.strip()
217
+ if end and end != start:
218
+ _bring_checkout_forward(product_path, start, end)
219
+ return code
220
+ finally:
221
+ _git(product_path, "worktree", "remove", "--force", worktree)
222
+ _git(product_path, "worktree", "prune")
223
+ shutil.rmtree(temporary, ignore_errors=True)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: splent_cli
3
- Version: 1.51.0
3
+ Version: 1.53.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
@@ -186,6 +186,7 @@ src/splent_cli/services/registry.py
186
186
  src/splent_cli/services/release.py
187
187
  src/splent_cli/services/release_dry_run.py
188
188
  src/splent_cli/services/release_gate.py
189
+ src/splent_cli/services/release_workspace.py
189
190
  src/splent_cli/services/security_scan.py
190
191
  src/splent_cli/services/source_mirror.py
191
192
  src/splent_cli/services/spl_store.py
File without changes
File without changes
File without changes
File without changes