wexample-wex-addon-dev-php 12.5.0__tar.gz → 12.7.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 (152) hide show
  1. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/PKG-INFO +14 -14
  2. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/README.md +8 -8
  3. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/pyproject.toml +6 -6
  4. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/deployment/step/symfony_env_local_deployment_step.py +41 -7
  5. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/resources/docker/Dockerfile.roave +7 -2
  6. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/composer/docker/docker-compose.yml +5 -1
  7. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/frankenphp/docker/docker-compose.yml +1 -1
  8. wexample_wex_addon_dev_php-12.7.0/src/wexample_wex_addon_dev_php/services/frankenphp/samples/caddy/Caddyfile +17 -0
  9. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/php/docker/docker-compose.yml +1 -1
  10. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/php/samples/caddy/Caddyfile +4 -0
  11. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/symfony/samples/docker/images/Dockerfile.dev +2 -2
  12. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/symfony/samples/docker/images/Dockerfile.release +6 -6
  13. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/workdir/php_package_workdir.py +13 -3
  14. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/workdir/php_symfony_workdir.py +26 -0
  15. wexample_wex_addon_dev_php-12.5.0/src/wexample_wex_addon_dev_php/services/frankenphp/samples/caddy/Caddyfile +0 -13
  16. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/__init__.py +0 -0
  17. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/__pycache__/__init__.py +0 -0
  18. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/config_value/__init__.py +0 -0
  19. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/config_value/php_package_readme_config_value.py +0 -0
  20. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/const/__init__.py +0 -0
  21. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/const/tags.py +0 -0
  22. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/deployment/__init__.py +0 -0
  23. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/deployment/step/__init__.py +0 -0
  24. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/file/__init__.py +0 -0
  25. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/file/php_composer_json_file.py +0 -0
  26. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/formatter/__init__.py +0 -0
  27. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/formatter/php_code_formatter.py +0 -0
  28. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/php_addon_manager.py +0 -0
  29. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/py.typed +0 -0
  30. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/resources/.wex.yml +0 -0
  31. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/resources/design_rules/php_code.md +0 -0
  32. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/resources/writing_rules/php_code.md +0 -0
  33. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/__init__.py +0 -0
  34. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/composer/__init__.py +0 -0
  35. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/composer/commands/__init__.py +0 -0
  36. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/composer/commands/service/__init__.py +0 -0
  37. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/composer/commands/service/install_local.py +0 -0
  38. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/composer/commands/service/refresh_lock.py +0 -0
  39. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/composer/docker/.wex.yml +0 -0
  40. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/composer/service.yml +0 -0
  41. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/frankenphp/__init__.py +0 -0
  42. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/frankenphp/docker/.wex.yml +0 -0
  43. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/frankenphp/samples/.wex.yml +0 -0
  44. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/frankenphp/samples/caddy/.wex.yml +0 -0
  45. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/frankenphp/samples/docker/.wex.yml +0 -0
  46. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/frankenphp/samples/docker/docker-compose.yml +0 -0
  47. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/frankenphp/samples/env/dev/docker/.wex.yml +0 -0
  48. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/frankenphp/samples/env/dev/docker/docker-compose.yml +0 -0
  49. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/frankenphp/samples/env/local/docker/.wex.yml +0 -0
  50. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/frankenphp/samples/env/local/docker/docker-compose.yml +0 -0
  51. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/frankenphp/samples/env/prod/docker/.wex.yml +0 -0
  52. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/frankenphp/samples/env/prod/docker/docker-compose.yml +0 -0
  53. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/frankenphp/samples/php/.wex.yml +0 -0
  54. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/frankenphp/samples/php/web.ini +0 -0
  55. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/frankenphp/service.yml +0 -0
  56. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/laravel/__init__.py +0 -0
  57. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/laravel/app_service.py +0 -0
  58. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/laravel/commands/__init__.py +0 -0
  59. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/laravel/commands/db/__init__.py +0 -0
  60. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/laravel/commands/db/migrate.yml +0 -0
  61. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/laravel/commands/maintenance/__init__.py +0 -0
  62. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/laravel/commands/maintenance/disable.yml +0 -0
  63. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/laravel/commands/maintenance/enable.yml +0 -0
  64. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/laravel/commands/service/__init__.py +0 -0
  65. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/laravel/commands/service/install_local.py +0 -0
  66. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/laravel/commands/service/refresh_lock.py +0 -0
  67. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/laravel/docker/.wex.yml +0 -0
  68. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/laravel/docker/docker-compose.yml +0 -0
  69. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/laravel/samples/.wex.yml +0 -0
  70. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/laravel/samples/docker/docker-compose.yml +0 -0
  71. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/laravel/samples/env/dev/docker/docker-compose.yml +0 -0
  72. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/laravel/samples/env/prod/docker/docker-compose.yml +0 -0
  73. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/laravel/service.yml +0 -0
  74. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/php/__init__.py +0 -0
  75. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/php/ai/__init__.py +0 -0
  76. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/php/ai/shared/__init__.py +0 -0
  77. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/php/ai/shared/context.j2 +0 -0
  78. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/php/ai/shared/php.j2 +0 -0
  79. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/php/docker/.wex.yml +0 -0
  80. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/php/samples/.wex.yml +0 -0
  81. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/php/samples/caddy/.wex.yml +0 -0
  82. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/php/samples/docker/.wex.yml +0 -0
  83. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/php/samples/docker/docker-compose.yml +0 -0
  84. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/php/samples/env/dev/docker/.wex.yml +0 -0
  85. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/php/samples/env/dev/docker/docker-compose.yml +0 -0
  86. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/php/samples/env/local/docker/.wex.yml +0 -0
  87. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/php/samples/env/local/docker/docker-compose.yml +0 -0
  88. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/php/samples/env/prod/docker/.wex.yml +0 -0
  89. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/php/samples/env/prod/docker/docker-compose.yml +0 -0
  90. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/php/samples/php/.wex.yml +0 -0
  91. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/php/samples/php/web.ini +0 -0
  92. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/php/service.yml +0 -0
  93. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/phpmyadmin/__init__.py +0 -0
  94. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/phpmyadmin/commands/__init__.py +0 -0
  95. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/phpmyadmin/commands/runtime/__init__.py +0 -0
  96. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/phpmyadmin/docker/.wex.yml +0 -0
  97. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/phpmyadmin/docker/docker-compose.yml +0 -0
  98. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/phpmyadmin/env/.wex.yml +0 -0
  99. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/phpmyadmin/env/local/docker/docker-compose.yml +0 -0
  100. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/phpmyadmin/service.yml +0 -0
  101. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/symfony/__init__.py +0 -0
  102. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/symfony/ai/__init__.py +0 -0
  103. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/symfony/ai/agents/__init__.py +0 -0
  104. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/symfony/ai/agents/editor/__init__.py +0 -0
  105. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/symfony/ai/agents/editor/agent.yml +0 -0
  106. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/symfony/ai/agents/editor/context.j2 +0 -0
  107. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/symfony/ai/shared/__init__.py +0 -0
  108. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/symfony/ai/shared/context.j2 +0 -0
  109. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/symfony/app_service.py +0 -0
  110. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/symfony/commands/__init__.py +0 -0
  111. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/symfony/commands/service/__init__.py +0 -0
  112. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/symfony/commands/service/deploy.py +0 -0
  113. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/symfony/commands/service/install_local.py +0 -0
  114. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/symfony/commands/service/watch.py +0 -0
  115. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/symfony/commands/translations/__init__.py +0 -0
  116. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/symfony/commands/translations/translate.py +0 -0
  117. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/symfony/docker/.wex.yml +0 -0
  118. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/symfony/docker/docker-compose.yml +0 -0
  119. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/symfony/knowledge/__init__.py +0 -0
  120. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/symfony/knowledge/entity.md +0 -0
  121. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/symfony/samples/.wex.yml +0 -0
  122. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/symfony/samples/docker/.wex.yml +0 -0
  123. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/symfony/samples/docker/docker-compose.yml +0 -0
  124. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/symfony/samples/docker/env.build +0 -0
  125. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/symfony/samples/docker/images/.wex.yml +0 -0
  126. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/symfony/samples/env/dev/docker/.wex.yml +0 -0
  127. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/symfony/samples/env/dev/docker/docker-compose.yml +0 -0
  128. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/symfony/samples/env/local/docker/.wex.yml +0 -0
  129. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/symfony/samples/env/local/docker/docker-compose.yml +0 -0
  130. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/symfony/samples/env/prod/docker/.wex.yml +0 -0
  131. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/symfony/samples/env/prod/docker/docker-compose.yml +0 -0
  132. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/symfony/service.yml +0 -0
  133. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/wordpress/__init__.py +0 -0
  134. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/wordpress/commands/__init__.py +0 -0
  135. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/wordpress/commands/service/__init__.py +0 -0
  136. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/wordpress/commands/url/__init__.py +0 -0
  137. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/wordpress/commands/url/replace.py +0 -0
  138. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/wordpress/docker/.wex.yml +0 -0
  139. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/wordpress/docker/docker-compose.yml +0 -0
  140. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/wordpress/samples/.wex.yml +0 -0
  141. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/wordpress/samples/docker/docker-compose-cli.yml +0 -0
  142. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/wordpress/samples/docker/docker-compose.yml +0 -0
  143. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/wordpress/samples/env/dev/docker/docker-compose.yml +0 -0
  144. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/wordpress/samples/env/local/wp-cli/.gitkeep +0 -0
  145. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/wordpress/samples/env/prod/docker/docker-compose.yml +0 -0
  146. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/services/wordpress/service.yml +0 -0
  147. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/workdir/__init__.py +0 -0
  148. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/workdir/php_packages_suite_workdir.py +0 -0
  149. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/src/wexample_wex_addon_dev_php/workdir/php_workdir.py +0 -0
  150. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/tests/.gitkeep +0 -0
  151. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/tests/workdir/__init__.py +0 -0
  152. {wexample_wex_addon_dev_php-12.5.0 → wexample_wex_addon_dev_php-12.7.0}/tests/workdir/test_php_package_workdir.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: wexample-wex-addon-dev-php
3
- Version: 12.5.0
3
+ Version: 12.7.0
4
4
  Summary: Extends wex with PHP-specific development commands for Composer, Laravel, Symfony, and WordPress services running in Docker containers
5
5
  Author-Email: weeger <contact@wexample.com>
6
6
  License: MIT
@@ -11,11 +11,11 @@ Project-URL: homepage, https://github.com/wexample/python-wex-dev-python
11
11
  Requires-Python: >=3.10
12
12
  Requires-Dist: attrs>=23.1.0
13
13
  Requires-Dist: cattrs>=23.1.0
14
- Requires-Dist: wexample-filestate-php>=6.4.0
15
- Requires-Dist: wexample-filestate-symfony>=2.0.0
16
- Requires-Dist: wexample-wex-addon-ai>=17.0.0
17
- Requires-Dist: wexample-wex-addon-app>=32.3.0
18
- Requires-Dist: wexample-wex-addon-dev-javascript>=8.2.0
14
+ Requires-Dist: wexample-filestate-php>=6.5.0
15
+ Requires-Dist: wexample-filestate-symfony>=2.1.0
16
+ Requires-Dist: wexample-wex-addon-ai>=18.1.0
17
+ Requires-Dist: wexample-wex-addon-app>=33.0.0
18
+ Requires-Dist: wexample-wex-addon-dev-javascript>=8.3.0
19
19
  Provides-Extra: dev
20
20
  Requires-Dist: pytest; extra == "dev"
21
21
  Requires-Dist: pytest-cov; extra == "dev"
@@ -23,7 +23,7 @@ Description-Content-Type: text/markdown
23
23
 
24
24
  # wex_addon_dev_php
25
25
 
26
- Version: 12.5.0
26
+ Version: 12.7.0
27
27
 
28
28
  `wex_addon_dev_php` extends the wex CLI with PHP-specific development commands for Composer, Laravel, Symfony, and WordPress services running in Docker containers. It is aimed at PHP developers who manage their apps through wex and need framework-aware automation — dependency wiring, migration runs, lock-file refreshes — executed directly inside the running service containers. The addon registers four workdir types (`php`, `php-package`, `php-packages-suite`, `php-symfony`) and contributes its commands through the standard `PhpAddonManager` plugin point.
29
29
 
@@ -195,7 +195,7 @@ Services live under `src/wexample_wex_addon_dev_php/services/`. Each service has
195
195
 
196
196
  #### php
197
197
 
198
- Defined in src/wexample_wex_addon_dev_php/services/php/service.yml and src/wexample_wex_addon_dev_php/services/php/docker/docker-compose.yml. The base PHP service: runs `dunglas/frankenphp:php8.4`, mounts the app at `/var/www/html`, and binds a `Caddyfile` and a `web.ini` from the runtime config. The `laravel` and `symfony` containers extend this compose service definition. Sample files for the Caddyfile (serving from `public/`, `php_server` directive) and `web.ini` (upload limits, memory limit) are shipped in `services/php/samples/`.
198
+ Defined in src/wexample_wex_addon_dev_php/services/php/service.yml and src/wexample_wex_addon_dev_php/services/php/docker/docker-compose.yml. The base PHP service: runs `dunglas/frankenphp:1.13.0-php8.5.11`, mounts the app at `/var/www/html`, and binds a `Caddyfile` and a `web.ini` from the runtime config. The `laravel` and `symfony` containers extend this compose service definition. Sample files for the Caddyfile (serving from `public/`, `php_server` directive) and `web.ini` (upload limits, memory limit) are shipped in `services/php/samples/`.
199
199
 
200
200
  #### frankenphp
201
201
 
@@ -203,7 +203,7 @@ Defined in src/wexample_wex_addon_dev_php/services/frankenphp/service.yml. A sta
203
203
 
204
204
  #### composer
205
205
 
206
- Defined in src/wexample_wex_addon_dev_php/services/composer/service.yml. A dedicated Composer container (`composer:latest`) that mounts the app at `/var/www/html` and stays alive via `tail -f /dev/null`. Its commands are the generic lock-management routines that Laravel and Symfony both call.
206
+ Defined in src/wexample_wex_addon_dev_php/services/composer/service.yml. A dedicated Composer container (`composer:2.9.7`) that mounts the app at `/var/www/html` and stays alive via `tail -f /dev/null`. Its PHP is the image's, not the app's, so it runs with `COMPOSER_IGNORE_PLATFORM_REQS=1`: extensions such as `intl` are the app container's to have. Its commands are the generic lock-management routines that Laravel and Symfony both call.
207
207
 
208
208
  #### laravel
209
209
 
@@ -273,11 +273,11 @@ Visit the [Wexample Suite documentation](https://docs.wexample.com) for the comp
273
273
 
274
274
  - attrs: >=23.1.0
275
275
  - cattrs: >=23.1.0
276
- - wexample-filestate-php: >=6.4.0
277
- - wexample-filestate-symfony: >=2.0.0
278
- - wexample-wex-addon-ai: >=17.0.0
279
- - wexample-wex-addon-app: >=32.3.0
280
- - wexample-wex-addon-dev-javascript: >=8.2.0
276
+ - wexample-filestate-php: >=6.5.0
277
+ - wexample-filestate-symfony: >=2.1.0
278
+ - wexample-wex-addon-ai: >=18.1.0
279
+ - wexample-wex-addon-app: >=33.0.0
280
+ - wexample-wex-addon-dev-javascript: >=8.3.0
281
281
 
282
282
  ## Versioning & Compatibility Policy
283
283
 
@@ -1,6 +1,6 @@
1
1
  # wex_addon_dev_php
2
2
 
3
- Version: 12.5.0
3
+ Version: 12.7.0
4
4
 
5
5
  `wex_addon_dev_php` extends the wex CLI with PHP-specific development commands for Composer, Laravel, Symfony, and WordPress services running in Docker containers. It is aimed at PHP developers who manage their apps through wex and need framework-aware automation — dependency wiring, migration runs, lock-file refreshes — executed directly inside the running service containers. The addon registers four workdir types (`php`, `php-package`, `php-packages-suite`, `php-symfony`) and contributes its commands through the standard `PhpAddonManager` plugin point.
6
6
 
@@ -172,7 +172,7 @@ Services live under `src/wexample_wex_addon_dev_php/services/`. Each service has
172
172
 
173
173
  #### php
174
174
 
175
- Defined in src/wexample_wex_addon_dev_php/services/php/service.yml and src/wexample_wex_addon_dev_php/services/php/docker/docker-compose.yml. The base PHP service: runs `dunglas/frankenphp:php8.4`, mounts the app at `/var/www/html`, and binds a `Caddyfile` and a `web.ini` from the runtime config. The `laravel` and `symfony` containers extend this compose service definition. Sample files for the Caddyfile (serving from `public/`, `php_server` directive) and `web.ini` (upload limits, memory limit) are shipped in `services/php/samples/`.
175
+ Defined in src/wexample_wex_addon_dev_php/services/php/service.yml and src/wexample_wex_addon_dev_php/services/php/docker/docker-compose.yml. The base PHP service: runs `dunglas/frankenphp:1.13.0-php8.5.11`, mounts the app at `/var/www/html`, and binds a `Caddyfile` and a `web.ini` from the runtime config. The `laravel` and `symfony` containers extend this compose service definition. Sample files for the Caddyfile (serving from `public/`, `php_server` directive) and `web.ini` (upload limits, memory limit) are shipped in `services/php/samples/`.
176
176
 
177
177
  #### frankenphp
178
178
 
@@ -180,7 +180,7 @@ Defined in src/wexample_wex_addon_dev_php/services/frankenphp/service.yml. A sta
180
180
 
181
181
  #### composer
182
182
 
183
- Defined in src/wexample_wex_addon_dev_php/services/composer/service.yml. A dedicated Composer container (`composer:latest`) that mounts the app at `/var/www/html` and stays alive via `tail -f /dev/null`. Its commands are the generic lock-management routines that Laravel and Symfony both call.
183
+ Defined in src/wexample_wex_addon_dev_php/services/composer/service.yml. A dedicated Composer container (`composer:2.9.7`) that mounts the app at `/var/www/html` and stays alive via `tail -f /dev/null`. Its PHP is the image's, not the app's, so it runs with `COMPOSER_IGNORE_PLATFORM_REQS=1`: extensions such as `intl` are the app container's to have. Its commands are the generic lock-management routines that Laravel and Symfony both call.
184
184
 
185
185
  #### laravel
186
186
 
@@ -250,11 +250,11 @@ Visit the [Wexample Suite documentation](https://docs.wexample.com) for the comp
250
250
 
251
251
  - attrs: >=23.1.0
252
252
  - cattrs: >=23.1.0
253
- - wexample-filestate-php: >=6.4.0
254
- - wexample-filestate-symfony: >=2.0.0
255
- - wexample-wex-addon-ai: >=17.0.0
256
- - wexample-wex-addon-app: >=32.3.0
257
- - wexample-wex-addon-dev-javascript: >=8.2.0
253
+ - wexample-filestate-php: >=6.5.0
254
+ - wexample-filestate-symfony: >=2.1.0
255
+ - wexample-wex-addon-ai: >=18.1.0
256
+ - wexample-wex-addon-app: >=33.0.0
257
+ - wexample-wex-addon-dev-javascript: >=8.3.0
258
258
 
259
259
  ## Versioning & Compatibility Policy
260
260
 
@@ -6,7 +6,7 @@ build-backend = "pdm.backend"
6
6
 
7
7
  [project]
8
8
  name = "wexample-wex-addon-dev-php"
9
- version = "12.5.0"
9
+ version = "12.7.0"
10
10
  description = "Extends wex with PHP-specific development commands for Composer, Laravel, Symfony, and WordPress services running in Docker containers"
11
11
  authors = [
12
12
  { name = "weeger", email = "contact@wexample.com" },
@@ -20,11 +20,11 @@ classifiers = [
20
20
  dependencies = [
21
21
  "attrs>=23.1.0",
22
22
  "cattrs>=23.1.0",
23
- "wexample-filestate-php>=6.4.0",
24
- "wexample-filestate-symfony>=2.0.0",
25
- "wexample-wex-addon-ai>=17.0.0",
26
- "wexample-wex-addon-app>=32.3.0",
27
- "wexample-wex-addon-dev-javascript>=8.2.0",
23
+ "wexample-filestate-php>=6.5.0",
24
+ "wexample-filestate-symfony>=2.1.0",
25
+ "wexample-wex-addon-ai>=18.1.0",
26
+ "wexample-wex-addon-app>=33.0.0",
27
+ "wexample-wex-addon-dev-javascript>=8.3.0",
28
28
  ]
29
29
 
30
30
  [project.readme]
@@ -149,9 +149,23 @@ class SymfonyEnvLocalDeploymentStep(AbstractDeploymentStep):
149
149
  import secrets
150
150
  import shlex
151
151
 
152
- from wexample_wex_addon_app.helper.deployment import DEPLOYMENT_HOST_USER
152
+ from wexample_wex_addon_app.helper.deployment import (
153
+ DEPLOYMENT_HOST_USER,
154
+ host_secret_file_seal,
155
+ )
153
156
  from wexample_wex_addon_app.helper.remote import remote_run
154
157
 
158
+ path = f"{remote['path']}/.env.local"
159
+ if self._exists(remote):
160
+ # An existing file is the host's: only who may read it is put right.
161
+ result = remote_run(remote, host_secret_file_seal(path))
162
+ if result.returncode != 0:
163
+ raise RuntimeError(
164
+ f"Fixing the rights of {path} on {remote['host']} failed: "
165
+ f"{result.stderr.strip()[:300]}"
166
+ )
167
+ return f"Made {path} on {remote['host']} readable by the docker group"
168
+
155
169
  defaults = self._host_defaults(workdir, remote)
156
170
  values: dict[str, str] = {}
157
171
  generated: list[str] = []
@@ -164,13 +178,13 @@ class SymfonyEnvLocalDeploymentStep(AbstractDeploymentStep):
164
178
  # an empty one is how an app says « not used here ».
165
179
  values[key] = defaults.get(key, "")
166
180
 
167
- path = f"{remote['path']}/.env.local"
168
181
  # Through stdin, never a command line: a secret must not show in the host's
169
182
  # process list nor in a shell history. The `${KEY}` are resolved there.
170
183
  result = remote_run(
171
184
  remote,
172
185
  f"sudo -n -u {DEPLOYMENT_HOST_USER} python3 -c {shlex.quote(_HOST_WRITER)} "
173
- f"{shlex.quote(remote['path'] + '/.wex/local/env.yml')} {shlex.quote(path)}",
186
+ f"{shlex.quote(remote['path'] + '/.wex/local/env.yml')} {shlex.quote(path)} && "
187
+ + host_secret_file_seal(path),
174
188
  input="".join(f"{key}={_quote(value)}\n" for key, value in values.items()),
175
189
  )
176
190
  if result.returncode != 0:
@@ -190,8 +204,13 @@ class SymfonyEnvLocalDeploymentStep(AbstractDeploymentStep):
190
204
  return f"Wrote {path} on {remote['host']}{made}.{rest}"
191
205
 
192
206
  def can_apply(self, workdir: ManagedWorkdir, remote: ResolvedRemote | None) -> bool:
193
- # Written when there is none, never over one: an existing file is the host's.
194
- return self._host_keys(remote) == set() and not self._exists(remote)
207
+ from wexample_wex_addon_app.helper.deployment import host_secret_file_unsealed
208
+
209
+ # Written when there is none, never over one: an existing file is the host's,
210
+ # only its rights are put right.
211
+ if self._exists(remote):
212
+ return host_secret_file_unsealed(remote, f"{remote['path']}/.env.local") is not None
213
+ return self._host_keys(remote) == set()
195
214
 
196
215
  def check(self, workdir: ManagedWorkdir, remote: ResolvedRemote | None) -> tuple[str, str]:
197
216
  present = self._host_keys(remote)
@@ -199,12 +218,21 @@ class SymfonyEnvLocalDeploymentStep(AbstractDeploymentStep):
199
218
  return DEPLOYMENT_STATUS_UNKNOWN, "could not read it"
200
219
  if not present and not self._exists(remote):
201
220
  return DEPLOYMENT_STATUS_KO, f"no {remote['path']}/.env.local"
221
+ from wexample_wex_addon_app.helper.deployment import host_secret_file_unsealed
222
+
223
+ unsealed = host_secret_file_unsealed(remote, f"{remote['path']}/.env.local")
224
+ if unsealed:
225
+ return DEPLOYMENT_STATUS_KO, f"the app's commands cannot read it ({unsealed})"
202
226
  missing = [key for key in self._needed(workdir) if key not in present]
203
227
  if missing:
204
228
  return DEPLOYMENT_STATUS_KO, f"no value for {', '.join(missing)}"
205
229
  return DEPLOYMENT_STATUS_OK, f"{remote['path']}/.env.local"
206
230
 
207
231
  def hint(self, workdir: ManagedWorkdir, remote: ResolvedRemote | None) -> str:
232
+ from wexample_wex_addon_app.helper.deployment import host_secret_file_unsealed
233
+
234
+ if host_secret_file_unsealed(remote, f"{remote['path']}/.env.local"):
235
+ return "Run `wex app::release/setup` to make it readable by the docker group."
208
236
  present = self._host_keys(remote) or set()
209
237
  missing = [key for key in self._needed(workdir) if key not in present]
210
238
  return (
@@ -253,6 +281,7 @@ class SymfonyEnvLocalDeploymentStep(AbstractDeploymentStep):
253
281
 
254
282
  config = workdir.get_path() / "config"
255
283
  referenced: set[str] = set()
284
+ defaulted: set[str] = set()
256
285
  for path in config.rglob("*.yaml"):
257
286
  if any(part in NOT_DEPLOYED_ENVS for part in path.relative_to(config).parts):
258
287
  continue
@@ -262,13 +291,18 @@ class SymfonyEnvLocalDeploymentStep(AbstractDeploymentStep):
262
291
  # `default::KEY` falls back on its own: the app runs without it.
263
292
  if "default:" not in f"{processors}:":
264
293
  referenced.add(key)
294
+ # A parameter `env(KEY): value` is the value the app falls back on.
295
+ defaulted.update(re.findall(r"^\s+env\(([A-Za-z_][A-Za-z0-9_]*)\)\s*:", content, re.M))
265
296
  built = self._build_env_keys(workdir)
266
- needed = {key for key in referenced if key not in built} | set(ALWAYS_FROM_THE_HOST)
297
+ needed = {
298
+ key for key in referenced if key not in built and key not in defaulted
299
+ } | set(ALWAYS_FROM_THE_HOST)
267
300
  return sorted(needed)
268
301
 
269
302
 
270
303
  # Run on the host: fills every `${KEY}` of the content on stdin from the host's env
271
- # file, then writes it for the owner alone. A key the env file lacks stays as it is.
304
+ # file, then writes it for the owner alone — the caller then opens it to the docker
305
+ # group. A key the env file lacks stays as it is.
272
306
  _HOST_WRITER = """
273
307
  import os, re, sys
274
308
  values = {}
@@ -1,4 +1,4 @@
1
- FROM php:8.5-cli
1
+ FROM php:8.5.11-cli
2
2
 
3
3
  RUN apt-get update && apt-get install -y \
4
4
  git \
@@ -6,7 +6,12 @@ RUN apt-get update && apt-get install -y \
6
6
  libicu-dev \
7
7
  libzip-dev \
8
8
  libpng-dev \
9
+ libjpeg62-turbo-dev \
10
+ libwebp-dev \
9
11
  && rm -rf /var/lib/apt/lists/* \
12
+ # GD as the applications have it: a package writing a thumbnail as WebP
13
+ # from an uploaded JPEG fails here otherwise, and nowhere else.
14
+ && docker-php-ext-configure gd --with-jpeg --with-webp \
10
15
  && docker-php-ext-install bcmath gd intl zip \
11
16
  # A test suite compiling a Symfony container outgrows the CLI's 128M.
12
17
  && echo 'memory_limit=1G' > /usr/local/etc/php/conf.d/memory.ini
@@ -19,7 +24,7 @@ RUN git config --system --add safe.directory '*'
19
24
  RUN groupadd -g 1000 appuser && \
20
25
  useradd -m -u 1000 -g 1000 -s /bin/bash appuser
21
26
 
22
- COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
27
+ COPY --from=composer:2.9.7 /usr/bin/composer /usr/bin/composer
23
28
 
24
29
  USER appuser
25
30
  RUN composer global require roave/backward-compatibility-check
@@ -2,11 +2,15 @@ services:
2
2
  composer:
3
3
  restart: unless-stopped
4
4
  container_name: ${APP_PROJECT_NAME}_composer
5
- image: composer:latest
5
+ image: composer:2.9.7
6
6
  working_dir: /var/www/html
7
7
  command: tail -f /dev/null
8
8
  environment:
9
9
  COMPOSER_ALLOW_SUPERUSER: "1"
10
+ # This PHP is the composer image's, not the app's: its extensions and version
11
+ # say nothing about what the app runs on (intl, pdo_pgsql… live in the app
12
+ # container). Platform requirements are the app container's to check.
13
+ COMPOSER_IGNORE_PLATFORM_REQS: "1"
10
14
  volumes:
11
15
  - ${APP_PATH}:/var/www/html
12
16
  extends:
@@ -2,7 +2,7 @@ services:
2
2
  frankenphp:
3
3
  restart: unless-stopped
4
4
  container_name: ${APP_PROJECT_NAME}_frankenphp
5
- image: dunglas/frankenphp:php8.4
5
+ image: dunglas/frankenphp:1.13.0-php8.5.11
6
6
  environment:
7
7
  - VIRTUAL_HOST=${APP_DOMAINS_STRING}
8
8
  - VIRTUAL_PORT=80
@@ -0,0 +1,17 @@
1
+ {
2
+ frankenphp
3
+ auto_https off
4
+ admin off
5
+ }
6
+
7
+ :80 {
8
+ root * /var/www/html/public
9
+
10
+ encode zstd br gzip
11
+
12
+ # Where installed packages add their directives (the Mercure hub of
13
+ # wexample/symfony-live): inside the site, the only place Caddy reads them.
14
+ # wex:install
15
+
16
+ php_server
17
+ }
@@ -2,7 +2,7 @@ services:
2
2
  php:
3
3
  restart: unless-stopped
4
4
  container_name: ${APP_PROJECT_NAME}_php
5
- image: dunglas/frankenphp:php8.4
5
+ image: dunglas/frankenphp:1.13.0-php8.5.11
6
6
  environment:
7
7
  - VIRTUAL_HOST=${APP_DOMAINS_STRING}
8
8
  - VIRTUAL_PORT=80
@@ -26,5 +26,9 @@
26
26
  }
27
27
  respond @hidden 404
28
28
 
29
+ # Where installed packages add their directives (the Mercure hub of
30
+ # wexample/symfony-live): inside the site, the only place Caddy reads them.
31
+ # wex:install
32
+
29
33
  php_server
30
34
  }
@@ -2,6 +2,6 @@
2
2
  # containers (see the composer and node services), so nothing here needs to
3
3
  # know how the app is built.
4
4
 
5
- FROM dunglas/frankenphp:php8.4
5
+ FROM dunglas/frankenphp:1.13.0-php8.5.11
6
6
 
7
- RUN install-php-extensions pdo_pgsql intl
7
+ RUN install-php-extensions pdo_pgsql intl gd
@@ -6,16 +6,16 @@
6
6
  # .wex/docker/env.build lets that kernel boot without any deployment secret;
7
7
  # the database is never queried.
8
8
 
9
- FROM dunglas/frankenphp:php8.4 AS build
9
+ FROM dunglas/frankenphp:1.13.0-php8.5.11 AS build
10
10
 
11
- RUN install-php-extensions pdo_pgsql intl zip
11
+ RUN install-php-extensions pdo_pgsql intl zip gd
12
12
 
13
- RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \
13
+ RUN curl -fsSL https://deb.nodesource.com/setup_24.x | bash - \
14
14
  && apt-get install -y --no-install-recommends nodejs git unzip \
15
15
  && npm install -g yarn \
16
16
  && rm -rf /var/lib/apt/lists/*
17
17
 
18
- COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
18
+ COPY --from=composer:2.9.7 /usr/bin/composer /usr/bin/composer
19
19
 
20
20
  WORKDIR /var/www/html
21
21
 
@@ -35,9 +35,9 @@ RUN cp .wex/docker/env.build .env \
35
35
  && php bin/console cache:warmup \
36
36
  && rm -rf node_modules
37
37
 
38
- FROM dunglas/frankenphp:php8.4
38
+ FROM dunglas/frankenphp:1.13.0-php8.5.11
39
39
 
40
- RUN install-php-extensions pdo_pgsql intl opcache
40
+ RUN install-php-extensions pdo_pgsql intl opcache gd
41
41
 
42
42
  WORKDIR /var/www/html
43
43
 
@@ -195,8 +195,10 @@ class PhpPackageWorkdir(WithRunnerWorkdirMixin, PhpWorkdir):
195
195
  php is not on the host, and neither are the dependencies: a package's
196
196
  vendor/ lives in a Docker volume of its own, mounted where the tests
197
197
  expect it, so the host keeps no copy of it for an editor to index. The
198
- volume is refilled only when composer.json changed since; no lock is
199
- written, the package's own being left as it is.
198
+ volume is refilled when any composer.json of the suite changed since —
199
+ the siblings' too, since a path dependency gaining a requirement leaves
200
+ this package's own manifest untouched and its vendor/ short of it. No
201
+ lock is written, the package's own being left as it is.
200
202
 
201
203
  The packages' directory is mounted whole: the local siblings are linked
202
204
  into vendor/ by relative paths (composer path repositories). Run as the
@@ -216,6 +218,11 @@ class PhpPackageWorkdir(WithRunnerWorkdirMixin, PhpWorkdir):
216
218
  vendor_volume = f"wex-php-vendor-{path.name}-{path_hash}"
217
219
  cache_volume = "wex-php-composer-cache"
218
220
 
221
+ # The tests run as the user and write in the package (a test kernel's
222
+ # var/cache…): what an earlier run as root left there is handed back first.
223
+ if os.geteuid() == 0:
224
+ self.restore_real_user_ownership()
225
+
219
226
  # The mount point: Docker would create it as root otherwise. Created by
220
227
  # the user already when wex itself does not run as root.
221
228
  vendor_dir = path / "vendor"
@@ -239,7 +246,10 @@ class PhpPackageWorkdir(WithRunnerWorkdirMixin, PhpWorkdir):
239
246
  package_dir = f"{packages_dir}/{path.name}"
240
247
  script = (
241
248
  "set -e; "
242
- 'sum=$(sha1sum composer.json | cut -d" " -f1); '
249
+ # Every manifest of the mounted suite, not just this package's:
250
+ # the siblings are path dependencies, and what they require lands
251
+ # in this vendor/ without their change showing here.
252
+ 'sum=$(cat composer.json ../*/composer.json | sha1sum | cut -d" " -f1); '
243
253
  'if [ "$(cat vendor/.wex-composer-json 2>/dev/null)" != "$sum" ]; then '
244
254
  "composer config --global lock false; "
245
255
  "composer update --no-interaction --no-progress --no-scripts; "
@@ -94,6 +94,8 @@ class PhpSymfonyWorkdir(PhpWorkdir):
94
94
 
95
95
  raw_value = super().prepare_value(raw_value=raw_value)
96
96
 
97
+ self._require_symfony_acolyte(raw_value)
98
+
97
99
  # Declared statically rather than left to the inherited recursive
98
100
  # filter, because `sidecar_of` resolves its primary by the identity of
99
101
  # the very dict declaring it.
@@ -860,3 +862,27 @@ class PhpSymfonyWorkdir(PhpWorkdir):
860
862
  install = manifest.get("extra", {}).get("install", {})
861
863
  if install:
862
864
  yield name, directory, install
865
+
866
+ def _require_symfony_acolyte(self, raw_value: DictConfig) -> None:
867
+ """Make the app's composer.json require the package its content rules call.
868
+
869
+ The Symfony content options (`entity_extend` and siblings) are answered by a
870
+ console command shipped in a Composer package. Declaring the rules without the
871
+ package let rectification crash on any app that had not added it by hand — and
872
+ a local symlink under `vendor/` was no proof of it: without the requirement
873
+ Composer neither autoloads the package nor the app registers its bundle.
874
+
875
+ Only the requirement is written, and only when absent. The bundle still has to be
876
+ listed in `config/bundles.php`, which is PHP and not a structured file.
877
+ """
878
+ from wexample_filestate_symfony.const.symfony import (
879
+ SYMFONY_ACOLYTE_CONSTRAINT,
880
+ SYMFONY_ACOLYTE_PACKAGE,
881
+ )
882
+
883
+ for child in raw_value["children"]:
884
+ if isinstance(child, dict) and child.get("name") == "composer.json":
885
+ child.setdefault("should_contain_keys", {})[
886
+ f"require.{SYMFONY_ACOLYTE_PACKAGE}"
887
+ ] = SYMFONY_ACOLYTE_CONSTRAINT
888
+ return
@@ -1,13 +0,0 @@
1
- {
2
- frankenphp
3
- auto_https off
4
- admin off
5
- }
6
-
7
- :80 {
8
- root * /var/www/html/public
9
-
10
- encode zstd br gzip
11
-
12
- php_server
13
- }