splent-cli 1.31.0__tar.gz → 1.32.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. {splent_cli-1.31.0/src/splent_cli.egg-info → splent_cli-1.32.0}/PKG-INFO +1 -1
  2. {splent_cli-1.31.0 → splent_cli-1.32.0}/pyproject.toml +1 -1
  3. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_build.py +97 -2
  4. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_release.py +25 -0
  5. {splent_cli-1.31.0 → splent_cli-1.32.0/src/splent_cli.egg-info}/PKG-INFO +1 -1
  6. {splent_cli-1.31.0 → splent_cli-1.32.0}/LICENSE +0 -0
  7. {splent_cli-1.31.0 → splent_cli-1.32.0}/README.md +0 -0
  8. {splent_cli-1.31.0 → splent_cli-1.32.0}/setup.cfg +0 -0
  9. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/__init__.py +0 -0
  10. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/__main__.py +0 -0
  11. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/cli.py +0 -0
  12. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/__init__.py +0 -0
  13. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/cache/__init__.py +0 -0
  14. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/cache/cache_clear.py +0 -0
  15. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/cache/cache_orphans.py +0 -0
  16. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/cache/cache_outdated.py +0 -0
  17. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/cache/cache_prune.py +0 -0
  18. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/cache/cache_size.py +0 -0
  19. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/cache/cache_status.py +0 -0
  20. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/cache/cache_usage.py +0 -0
  21. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/cache/cache_versions.py +0 -0
  22. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/check/__init__.py +0 -0
  23. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/check/check_contracts.py +0 -0
  24. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/check/check_deps.py +0 -0
  25. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/check/check_docker.py +0 -0
  26. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/check/check_env.py +0 -0
  27. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/check/check_features.py +0 -0
  28. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/check/check_github.py +0 -0
  29. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/check/check_infra.py +0 -0
  30. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/check/check_product.py +0 -0
  31. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/check/check_pypi.py +0 -0
  32. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/check/check_pyproject.py +0 -0
  33. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/check/check_releases.py +0 -0
  34. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/clear/__init__.py +0 -0
  35. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/clear/clear_build.py +0 -0
  36. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/clear/clear_log.py +0 -0
  37. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/clear/clear_uploads.py +0 -0
  38. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/command/__init__.py +0 -0
  39. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/command/command_create.py +0 -0
  40. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/coverage.py +0 -0
  41. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/database/db_console.py +0 -0
  42. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/database/db_dump.py +0 -0
  43. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/database/db_migrate.py +0 -0
  44. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/database/db_reset.py +0 -0
  45. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/database/db_restore.py +0 -0
  46. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/database/db_rollback.py +0 -0
  47. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/database/db_seed.py +0 -0
  48. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/database/db_status.py +0 -0
  49. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/database/db_upgrade.py +0 -0
  50. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/doctor.py +0 -0
  51. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/env/env_list.py +0 -0
  52. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/env/env_set.py +0 -0
  53. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/env/env_show.py +0 -0
  54. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/export/__init__.py +0 -0
  55. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/export/export_puml.py +0 -0
  56. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_add.py +0 -0
  57. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_attach.py +0 -0
  58. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_clean.py +0 -0
  59. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_clone.py +0 -0
  60. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_compat.py +0 -0
  61. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_compile.py +0 -0
  62. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_contract.py +0 -0
  63. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_create.py +0 -0
  64. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_delete.py +0 -0
  65. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_detach.py +0 -0
  66. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_discard.py +0 -0
  67. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_drift.py +0 -0
  68. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_env.py +0 -0
  69. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_fork.py +0 -0
  70. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_git.py +0 -0
  71. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_hook_add.py +0 -0
  72. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_hook_remove.py +0 -0
  73. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_hooks.py +0 -0
  74. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_impact.py +0 -0
  75. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_info.py +0 -0
  76. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_inject_config.py +0 -0
  77. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_install.py +0 -0
  78. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_list.py +0 -0
  79. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_order.py +0 -0
  80. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_outdated.py +0 -0
  81. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_pin.py +0 -0
  82. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_pip_install.py +0 -0
  83. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_pull.py +0 -0
  84. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_refine.py +0 -0
  85. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_release.py +0 -0
  86. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_remove.py +0 -0
  87. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_rename.py +0 -0
  88. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_search.py +0 -0
  89. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_status.py +0 -0
  90. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_sync_template.py +0 -0
  91. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_test.py +0 -0
  92. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_translate.py +0 -0
  93. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_unlock.py +0 -0
  94. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_upgrade.py +0 -0
  95. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_versions.py +0 -0
  96. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/feature/feature_xray.py +0 -0
  97. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/lint.py +0 -0
  98. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/locust.py +0 -0
  99. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/marketplace/login.py +0 -0
  100. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/marketplace/logout.py +0 -0
  101. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/marketplace/marketplace_auth_utils.py +0 -0
  102. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/marketplace/marketplace_index.py +0 -0
  103. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/marketplace/whoami.py +0 -0
  104. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/__init__.py +0 -0
  105. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_auto_require.py +0 -0
  106. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_clean.py +0 -0
  107. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_commands.py +0 -0
  108. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_config.py +0 -0
  109. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_configure.py +0 -0
  110. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_console.py +0 -0
  111. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_containers.py +0 -0
  112. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_create.py +0 -0
  113. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_deploy.py +0 -0
  114. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_derive.py +0 -0
  115. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_deselect.py +0 -0
  116. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_down.py +0 -0
  117. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_drift.py +0 -0
  118. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_env.py +0 -0
  119. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_list.py +0 -0
  120. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_logs.py +0 -0
  121. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_missing.py +0 -0
  122. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_port.py +0 -0
  123. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_resolve.py +0 -0
  124. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_restart.py +0 -0
  125. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_routes.py +0 -0
  126. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_run.py +0 -0
  127. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_select.py +0 -0
  128. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_shell.py +0 -0
  129. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_signals.py +0 -0
  130. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_sync_template.py +0 -0
  131. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_test.py +0 -0
  132. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_up.py +0 -0
  133. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/product/product_validate.py +0 -0
  134. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/release/__init__.py +0 -0
  135. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/release/release_core.py +0 -0
  136. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/release/release_resume.py +0 -0
  137. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/selenium.py +0 -0
  138. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/spl/__init__.py +0 -0
  139. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/spl/spl_add_constraints.py +0 -0
  140. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/spl/spl_add_feature.py +0 -0
  141. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/spl/spl_compare.py +0 -0
  142. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/spl/spl_configurations.py +0 -0
  143. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/spl/spl_create.py +0 -0
  144. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/spl/spl_deps.py +0 -0
  145. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/spl/spl_features.py +0 -0
  146. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/spl/spl_fetch.py +0 -0
  147. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/spl/spl_info.py +0 -0
  148. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/spl/spl_list.py +0 -0
  149. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/spl/spl_outdated.py +0 -0
  150. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/spl/spl_pin.py +0 -0
  151. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/spl/spl_publish.py +0 -0
  152. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/spl/spl_remove_feature.py +0 -0
  153. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/spl/spl_utils.py +0 -0
  154. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/tokens_setup.py +0 -0
  155. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/uvl/uvl_utils.py +0 -0
  156. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/commands/version.py +0 -0
  157. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/services/__init__.py +0 -0
  158. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/services/compose.py +0 -0
  159. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/services/context.py +0 -0
  160. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/services/credentials.py +0 -0
  161. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/services/deploy_bundle.py +0 -0
  162. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/services/image_registry.py +0 -0
  163. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/services/index_refresh.py +0 -0
  164. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/services/marketplace.py +0 -0
  165. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/services/marketplace_api.py +0 -0
  166. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/services/marketplace_url.py +0 -0
  167. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/services/preflight.py +0 -0
  168. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/services/pypi_quota.py +0 -0
  169. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/services/registry.py +0 -0
  170. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/services/release.py +0 -0
  171. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/services/release_dry_run.py +0 -0
  172. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/services/release_gate.py +0 -0
  173. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/services/spl_store.py +0 -0
  174. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/__init__.py +0 -0
  175. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/archetype.py +0 -0
  176. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/cache_utils.py +0 -0
  177. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/command_loader.py +0 -0
  178. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/contract_freshness.py +0 -0
  179. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/db_client.py +0 -0
  180. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/db_utils.py +0 -0
  181. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/decorators.py +0 -0
  182. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/dynamic_imports.py +0 -0
  183. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/feature_installer.py +0 -0
  184. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/feature_utils.py +0 -0
  185. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/forge.py +0 -0
  186. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/git_url.py +0 -0
  187. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/integrity.py +0 -0
  188. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/io_utils.py +0 -0
  189. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/lifecycle.py +0 -0
  190. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/manifest.py +0 -0
  191. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/path_utils.py +0 -0
  192. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/proc.py +0 -0
  193. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/redact.py +0 -0
  194. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/refinement_facts.py +0 -0
  195. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/template_drift.py +0 -0
  196. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/toml_edit.py +0 -0
  197. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli/utils/upgrade_plan.py +0 -0
  198. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli.egg-info/SOURCES.txt +0 -0
  199. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli.egg-info/dependency_links.txt +0 -0
  200. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli.egg-info/entry_points.txt +0 -0
  201. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli.egg-info/requires.txt +0 -0
  202. {splent_cli-1.31.0 → splent_cli-1.32.0}/src/splent_cli.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: splent_cli
3
- Version: 1.31.0
3
+ Version: 1.32.0
4
4
  Summary: SPLENT-CLI is a CLI to be able to work on your development more easily.
5
5
  Author-email: DiversoLab <diversolab@us.es>
6
6
  Project-URL: Homepage, https://github.com/diverso-lab/splent_cli
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "splent_cli"
7
- version = "1.31.0"
7
+ version = "1.32.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"
@@ -45,6 +45,17 @@ CONTRACTS_FORMAT = 1
45
45
  REQUIREMENTS_FILE = "requirements.prod.txt"
46
46
  GUNICORN_REQUIREMENT = "gunicorn>=23,<24"
47
47
 
48
+ # Every third-party package the production image installs, at the version the
49
+ # last build resolved, read back from the image with pip freeze. The
50
+ # Dockerfile applies it as a constraint on every pip install, so two builds of
51
+ # one commit install the same set. Versioned beside requirements.prod.txt.
52
+ LOCK_FILE = "requirements.lock"
53
+ LOCK_HEADER = (
54
+ "# Every third-party package the production image installs, at the version\n"
55
+ "# the last build resolved. Written by splent product:build and\n"
56
+ "# product:release from the image itself. Do not edit it.\n"
57
+ )
58
+
48
59
  # Database settings every product names the same way. A template writes <SET>
49
60
  # for them, and the CLI fills them in rather than ask: nobody needs to choose
50
61
  # what the database is called.
@@ -424,6 +435,75 @@ def runtime_requirements(workspace: str) -> str:
424
435
  )
425
436
 
426
437
 
438
+ def _canonical(name: str) -> str:
439
+ import re
440
+
441
+ return re.sub(r"[-_.]+", "-", name).lower()
442
+
443
+
444
+ def lock_text(freeze_output: str, product: str) -> str:
445
+ """docker/requirements.lock from what pip freeze reports in the image.
446
+
447
+ SPLENT's own packages (the framework, the CLI, every feature) and the
448
+ product are left out: their versions are pinned where they are chosen, in
449
+ requirements.prod.txt and pyproject.toml, and a feature installed from its
450
+ git tag is not something a constraints file can name.
451
+ """
452
+ product_name = _canonical(product)
453
+ kept = []
454
+ for line in freeze_output.splitlines():
455
+ line = line.strip()
456
+ if not line or line.startswith(("#", "-")) or " @ " in line or "==" not in line:
457
+ continue
458
+ name = _canonical(line.split("==", 1)[0])
459
+ if name.startswith("splent") or name == product_name:
460
+ continue
461
+ kept.append(line)
462
+ return LOCK_HEADER + "".join(f"{line}\n" for line in sorted(kept, key=str.lower))
463
+
464
+
465
+ def ensure_lock(docker_path: str) -> str:
466
+ """The lock's path, written with no pin yet when the product has none."""
467
+ path = os.path.join(docker_path, LOCK_FILE)
468
+ if not os.path.isfile(path):
469
+ atomic_write(path, LOCK_HEADER, dir_owner=True)
470
+ return path
471
+
472
+
473
+ def write_lock_from_image(image: str, product: str, docker_path: str) -> int:
474
+ """Pin in docker/requirements.lock what ``image`` installed. Returns how many."""
475
+ frozen = subprocess.run(
476
+ ["docker", "run", "--rm", "--entrypoint", "pip", image, "freeze"],
477
+ capture_output=True,
478
+ text=True,
479
+ check=True,
480
+ ).stdout
481
+ text = lock_text(frozen, product)
482
+ atomic_write(os.path.join(docker_path, LOCK_FILE), text, dir_owner=True)
483
+ return sum(1 for line in text.splitlines() if line and not line.startswith("#"))
484
+
485
+
486
+ def resolve_lock(product: str, workspace: str, docker_path: str) -> int:
487
+ """Resolve the third-party packages afresh and pin them in the lock.
488
+
489
+ Builds the image's build stage with SPLENT_FRESH_LOCK=1, which leaves the
490
+ current lock out, and reads back what it installed. product:release runs
491
+ this before its commit, so the lock it commits is what its image installs.
492
+ """
493
+ tag = f"{product}:lock"
494
+ subprocess.run(
495
+ production_image_build_command(
496
+ product,
497
+ workspace,
498
+ docker_path,
499
+ [tag],
500
+ extra=("--target", "builder", "--build-arg", "SPLENT_FRESH_LOCK=1"),
501
+ ),
502
+ check=True,
503
+ )
504
+ return write_lock_from_image(tag, product, docker_path)
505
+
506
+
427
507
  def pypi_serves(package: str, version: str) -> bool | None:
428
508
  """Whether PyPI serves ``package==version``. None when it could not be asked."""
429
509
  import requests
@@ -470,6 +550,7 @@ def production_image_build_command(
470
550
  docker_path: str,
471
551
  tags: Sequence[str],
472
552
  context: str | None = None,
553
+ extra: Sequence[str] = (),
473
554
  ) -> list[str]:
474
555
  """The ``docker build`` that produces the product's production image.
475
556
 
@@ -489,6 +570,7 @@ def production_image_build_command(
489
570
  for tag in tags:
490
571
  cmd += ["-t", tag]
491
572
  cmd += forge_build_args()
573
+ cmd += list(extra)
492
574
  cmd += ["-f", dockerfile, context]
493
575
  return cmd
494
576
 
@@ -526,6 +608,7 @@ def build_production_image(
526
608
  *,
527
609
  stage_model: bool = True,
528
610
  committed: bool = False,
611
+ fresh_lock: bool = False,
529
612
  ) -> None:
530
613
  """Build the production image under ``tags``.
531
614
 
@@ -547,9 +630,12 @@ def build_production_image(
547
630
  staged = stage_spl_model(workspace, product, docker_path)
548
631
  if staged:
549
632
  click.echo(f" Staged the UVL model: {staged}")
633
+ extra = ("--build-arg", "SPLENT_FRESH_LOCK=1") if fresh_lock else ()
550
634
  if not committed:
551
635
  subprocess.run(
552
- production_image_build_command(product, workspace, docker_path, tags),
636
+ production_image_build_command(
637
+ product, workspace, docker_path, tags, extra=extra
638
+ ),
553
639
  check=True,
554
640
  )
555
641
  return
@@ -557,7 +643,7 @@ def build_production_image(
557
643
  export_commit(os.path.join(workspace, product), tree)
558
644
  subprocess.run(
559
645
  production_image_build_command(
560
- product, workspace, docker_path, tags, context=tree
646
+ product, workspace, docker_path, tags, context=tree, extra=extra
561
647
  ),
562
648
  check=True,
563
649
  )
@@ -1572,6 +1658,8 @@ def write_deploy_artifacts(
1572
1658
  atomic_write(requirements_path, runtime_requirements(workspace), dir_owner=True)
1573
1659
  written.append(f"docker/{REQUIREMENTS_FILE}")
1574
1660
  click.echo(f"✅ Created: {requirements_path}")
1661
+ ensure_lock(docker_path)
1662
+ written.append(f"docker/{LOCK_FILE}")
1575
1663
  unpublished = unpublished_runtime_pins(workspace)
1576
1664
  if unpublished:
1577
1665
  click.secho(
@@ -1742,8 +1830,15 @@ def product_build(no_image, skip_preflight):
1742
1830
  docker_path,
1743
1831
  [f"{product}:{bundle.version}", f"{product}:latest"],
1744
1832
  stage_model=False,
1833
+ fresh_lock=True,
1745
1834
  )
1746
1835
  click.echo(f"✅ Image built: {product}:{bundle.version}")
1836
+ pinned = write_lock_from_image(
1837
+ f"{product}:{bundle.version}", product, docker_path
1838
+ )
1839
+ click.echo(
1840
+ f"✅ Pinned {pinned} third-party package(s) in docker/{LOCK_FILE}"
1841
+ )
1747
1842
  except subprocess.CalledProcessError:
1748
1843
  click.secho("❌ Docker image build failed.", fg="red")
1749
1844
  raise SystemExit(1)
@@ -11,11 +11,13 @@ import tempfile
11
11
  import click
12
12
  from splent_cli.commands.product.product_build import (
13
13
  CONTRACTS_SNAPSHOT,
14
+ LOCK_FILE,
14
15
  REQUIREMENTS_FILE,
15
16
  SPL_STAGING_DIR,
16
17
  build_production_image,
17
18
  production_dockerfile,
18
19
  unpublished_runtime_pins,
20
+ resolve_lock,
19
21
  unresolved_pins,
20
22
  write_deploy_artifacts,
21
23
  )
@@ -124,6 +126,7 @@ RELEASE_ARTIFACTS = (
124
126
  # before they exist.
125
127
  f"{deploy_bundle.BUNDLE_DIR}/",
126
128
  f"docker/{REQUIREMENTS_FILE}",
129
+ f"docker/{LOCK_FILE}",
127
130
  CONTRACTS_SNAPSHOT,
128
131
  f"docker/{SPL_STAGING_DIR}/",
129
132
  )
@@ -216,6 +219,28 @@ def write_release_artifacts(
216
219
  # The release about to publish the first image has no tag yet.
217
220
  publishes_image=publishes_image,
218
221
  )
222
+ if publishes_image:
223
+ # Resolved afresh for every release, so each one picks up the
224
+ # third-party fixes PyPI has, and committed, so a rebuild of the tag
225
+ # installs exactly what the release did.
226
+ require_docker()
227
+ click.echo(" lock resolving the third-party packages...")
228
+ try:
229
+ pinned = resolve_lock(
230
+ product, workspace, os.path.join(product_path, "docker")
231
+ )
232
+ except subprocess.CalledProcessError:
233
+ click.secho(
234
+ " error: the image's build stage did not build, so the "
235
+ "third-party packages could not be pinned. Nothing was "
236
+ "committed; the version bump in pyproject.toml is still to "
237
+ "undo or to release again.",
238
+ fg="red",
239
+ )
240
+ raise SystemExit(1)
241
+ click.echo(
242
+ f" lock {pinned} third-party package(s) pinned in docker/{LOCK_FILE}"
243
+ )
219
244
  subprocess.run(
220
245
  ["git", "add", "--", *bundle.paths],
221
246
  cwd=product_path,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: splent_cli
3
- Version: 1.31.0
3
+ Version: 1.32.0
4
4
  Summary: SPLENT-CLI is a CLI to be able to work on your development more easily.
5
5
  Author-email: DiversoLab <diversolab@us.es>
6
6
  Project-URL: Homepage, https://github.com/diverso-lab/splent_cli
File without changes
File without changes
File without changes