mirror of
https://github.com/MarijnDoeve/TijdVoorDeTest.git
synced 2026-07-05 23:20:18 +02:00
Compare commits
8 Commits
v0.1.1
...
d1d1eb3a24
| Author | SHA1 | Date | |
|---|---|---|---|
| d1d1eb3a24 | |||
| 5ea7a636b8 | |||
| d37136be93 | |||
| 212401a97f | |||
| 7c74574d3c | |||
| b1f84d441f | |||
| 8c72b1b217 | |||
| 806cff8c0f |
Executable
+48
@@ -0,0 +1,48 @@
|
|||||||
|
#!/usr/bin/env zsh
|
||||||
|
setopt ERR_EXIT PIPE_FAIL NOUNSET
|
||||||
|
|
||||||
|
# Collect staged PHP and Twig files
|
||||||
|
STAGED_PHP=()
|
||||||
|
while IFS= read -r file; do
|
||||||
|
[[ -n "$file" ]] && STAGED_PHP+=("$file")
|
||||||
|
done < <(git diff --cached --name-only --diff-filter=ACMR | grep -E '\.php$' || true)
|
||||||
|
|
||||||
|
STAGED_TWIG=()
|
||||||
|
while IFS= read -r file; do
|
||||||
|
[[ -n "$file" ]] && STAGED_TWIG+=("$file")
|
||||||
|
done < <(git diff --cached --name-only --diff-filter=ACMR | grep -E '\.twig$' || true)
|
||||||
|
|
||||||
|
if [[ ${#STAGED_PHP[@]} -eq 0 && ${#STAGED_TWIG[@]} -eq 0 ]]; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Use exec if the service is up, otherwise spin up a one-off container
|
||||||
|
if docker compose exec -T php true 2>/dev/null; then
|
||||||
|
DOCKER_CMD=(docker compose exec -T php)
|
||||||
|
else
|
||||||
|
echo "PHP service not running — using docker compose run..."
|
||||||
|
DOCKER_CMD=(docker compose run --rm php)
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ${#STAGED_PHP[@]} -gt 0 ]]; then
|
||||||
|
echo "PHP (${#STAGED_PHP[@]} file(s)): Rector → CS-Fixer → PHPStan"
|
||||||
|
|
||||||
|
echo " → Rector"
|
||||||
|
"${DOCKER_CMD[@]}" vendor/bin/rector process "${STAGED_PHP[@]}"
|
||||||
|
git add "${STAGED_PHP[@]}"
|
||||||
|
|
||||||
|
echo " → PHP-CS-Fixer"
|
||||||
|
"${DOCKER_CMD[@]}" vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.dist.php "${STAGED_PHP[@]}"
|
||||||
|
git add "${STAGED_PHP[@]}"
|
||||||
|
|
||||||
|
echo " → PHPStan"
|
||||||
|
"${DOCKER_CMD[@]}" vendor/bin/phpstan analyse "${STAGED_PHP[@]}" --no-progress
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ${#STAGED_TWIG[@]} -gt 0 ]]; then
|
||||||
|
echo "Twig (${#STAGED_TWIG[@]} file(s)): Twig-CS-Fixer"
|
||||||
|
|
||||||
|
echo " → Twig-CS-Fixer"
|
||||||
|
"${DOCKER_CMD[@]}" vendor/bin/twig-cs-fixer fix "${STAGED_TWIG[@]}"
|
||||||
|
git add "${STAGED_TWIG[@]}"
|
||||||
|
fi
|
||||||
@@ -28,3 +28,7 @@ updates:
|
|||||||
directory: "/"
|
directory: "/"
|
||||||
schedule:
|
schedule:
|
||||||
interval: "daily"
|
interval: "daily"
|
||||||
|
- package-ecosystem: "github-actions"
|
||||||
|
directory: "/"
|
||||||
|
schedule:
|
||||||
|
interval: "weekly"
|
||||||
|
|||||||
+118
-30
@@ -17,31 +17,58 @@ permissions:
|
|||||||
contents: read
|
contents: read
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
quality:
|
build:
|
||||||
name: Code Quality
|
name: Build Dev Image
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
timeout-minutes: 20
|
timeout-minutes: 15
|
||||||
|
if: "!startsWith(github.ref, 'refs/tags/')"
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7
|
||||||
|
with:
|
||||||
|
persist-credentials: false
|
||||||
- name: Lint Dockerfile
|
- name: Lint Dockerfile
|
||||||
uses: hadolint/hadolint-action@v3.1.0
|
uses: hadolint/hadolint-action@2332a7b74a6de0dda2e2221d575162eba76ba5e5 # v3.3.0
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4
|
||||||
- name: Build Docker images
|
- name: Build Docker images
|
||||||
uses: docker/bake-action@v5
|
uses: docker/bake-action@d3418bd7d0e9324001bca92fa8ba175ea7e6dc9b # v7
|
||||||
with:
|
with:
|
||||||
pull: true
|
pull: true
|
||||||
|
files: |
|
||||||
|
compose.yaml
|
||||||
|
compose.override.yaml
|
||||||
|
set: |
|
||||||
|
*.cache-from=type=gha,scope=${{github.ref}}-devbuild
|
||||||
|
*.cache-from=type=gha,scope=refs/heads/main-devbuild
|
||||||
|
*.cache-to=type=gha,scope=${{github.ref}}-devbuild,mode=${{ github.event_name == 'pull_request' && 'min' || 'max' }}
|
||||||
|
|
||||||
|
quality:
|
||||||
|
name: Code Quality
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
timeout-minutes: 20
|
||||||
|
needs: build
|
||||||
|
if: "!startsWith(github.ref, 'refs/tags/')"
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7
|
||||||
|
with:
|
||||||
|
persist-credentials: false
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4
|
||||||
|
- name: Load Docker images
|
||||||
|
uses: docker/bake-action@d3418bd7d0e9324001bca92fa8ba175ea7e6dc9b # v7
|
||||||
|
with:
|
||||||
load: true
|
load: true
|
||||||
files: |
|
files: |
|
||||||
compose.yaml
|
compose.yaml
|
||||||
compose.override.yaml
|
compose.override.yaml
|
||||||
set: |
|
set: |
|
||||||
*.cache-from=type=gha,scope=${{github.ref}}-quality
|
*.cache-from=type=gha,scope=${{github.ref}}-devbuild
|
||||||
*.cache-from=type=gha,scope=refs/heads/main
|
|
||||||
*.cache-to=type=gha,scope=${{github.ref}}-quality,mode=${{ github.event_name == 'pull_request' && 'min' || 'max' }}
|
|
||||||
- name: Start services
|
- name: Start services
|
||||||
run: docker compose up php database --wait --no-build
|
run: docker compose up php database --wait --no-build
|
||||||
- name: Warm up dev cache
|
- name: Warm up dev cache
|
||||||
@@ -71,34 +98,47 @@ jobs:
|
|||||||
- name: Assert all checks passed
|
- name: Assert all checks passed
|
||||||
if: always()
|
if: always()
|
||||||
run: |
|
run: |
|
||||||
outcomes="${{ steps.twig_lint.outcome }} ${{ steps.cs.outcome }} ${{ steps.twig_cs.outcome }} ${{ steps.phpstan.outcome }} ${{ steps.rector.outcome }}"
|
failed=0
|
||||||
if echo "$outcomes" | grep -q "failure"; then exit 1; fi
|
check() {
|
||||||
|
local name="$1" outcome="$2"
|
||||||
|
if [[ "$outcome" == "failure" ]]; then
|
||||||
|
echo "::error::$name failed"
|
||||||
|
failed=1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
check "Twig Lint" "${{ steps.twig_lint.outcome }}"
|
||||||
|
check "Coding Style" "${{ steps.cs.outcome }}"
|
||||||
|
check "Twig Coding Style" "${{ steps.twig_cs.outcome }}"
|
||||||
|
check "PHPStan" "${{ steps.phpstan.outcome }}"
|
||||||
|
check "Rector" "${{ steps.rector.outcome }}"
|
||||||
|
exit $failed
|
||||||
|
|
||||||
tests:
|
tests:
|
||||||
name: Tests
|
name: Tests
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
timeout-minutes: 20
|
timeout-minutes: 20
|
||||||
|
needs: build
|
||||||
|
if: "!startsWith(github.ref, 'refs/tags/')"
|
||||||
permissions:
|
permissions:
|
||||||
checks: write
|
checks: write
|
||||||
pull-requests: write
|
pull-requests: write
|
||||||
contents: read
|
contents: read
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7
|
||||||
- name: Set up Docker Buildx
|
with:
|
||||||
uses: docker/setup-buildx-action@v3
|
persist-credentials: false
|
||||||
- name: Build Docker images
|
- name: Set up Docker Buildx
|
||||||
uses: docker/bake-action@v5
|
uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4
|
||||||
|
- name: Load Docker images
|
||||||
|
uses: docker/bake-action@d3418bd7d0e9324001bca92fa8ba175ea7e6dc9b # v7
|
||||||
with:
|
with:
|
||||||
pull: true
|
|
||||||
load: true
|
load: true
|
||||||
files: |
|
files: |
|
||||||
compose.yaml
|
compose.yaml
|
||||||
compose.override.yaml
|
compose.override.yaml
|
||||||
set: |
|
set: |
|
||||||
*.cache-from=type=gha,scope=${{github.ref}}-tests
|
*.cache-from=type=gha,scope=${{github.ref}}-devbuild
|
||||||
*.cache-from=type=gha,scope=refs/heads/main
|
|
||||||
*.cache-to=type=gha,scope=${{github.ref}}-tests,mode=${{ github.event_name == 'pull_request' && 'min' || 'max' }}
|
|
||||||
- name: Start services
|
- name: Start services
|
||||||
run: docker compose up php database --wait --no-build
|
run: docker compose up php database --wait --no-build
|
||||||
- name: Create test database
|
- name: Create test database
|
||||||
@@ -111,13 +151,55 @@ jobs:
|
|||||||
run: docker compose exec -T php vendor/bin/phpunit --log-junit var/phpunit/junit.xml
|
run: docker compose exec -T php vendor/bin/phpunit --log-junit var/phpunit/junit.xml
|
||||||
- name: Publish PHPUnit test results
|
- name: Publish PHPUnit test results
|
||||||
if: always()
|
if: always()
|
||||||
uses: mikepenz/action-junit-report@v5
|
uses: mikepenz/action-junit-report@d9f48fc87bc235f7e214acf696ca5abc0a986f16 # v6
|
||||||
with:
|
with:
|
||||||
report_paths: var/phpunit/junit.xml
|
report_paths: var/phpunit/junit.xml
|
||||||
check_name: PHPUnit
|
check_name: PHPUnit
|
||||||
- name: Doctrine Schema Validator
|
- name: Doctrine Schema Validator
|
||||||
run: docker compose exec -T php bin/console -e test doctrine:schema:validate
|
run: docker compose exec -T php bin/console -e test doctrine:schema:validate
|
||||||
|
|
||||||
|
verify-prior-run:
|
||||||
|
name: Verify Prior CI Run
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
timeout-minutes: 20
|
||||||
|
if: startsWith(github.ref, 'refs/tags/')
|
||||||
|
permissions:
|
||||||
|
actions: read
|
||||||
|
steps:
|
||||||
|
- name: Wait for and verify successful CI run on this commit
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ github.token }}
|
||||||
|
run: |
|
||||||
|
max_attempts=30
|
||||||
|
attempt=0
|
||||||
|
while [[ $attempt -lt $max_attempts ]]; do
|
||||||
|
attempt=$((attempt + 1))
|
||||||
|
|
||||||
|
success_count=$(gh api \
|
||||||
|
"repos/${{ github.repository }}/actions/workflows/ci.yml/runs?head_sha=${{ github.sha }}&status=success&per_page=5" \
|
||||||
|
--jq "[.workflow_runs[] | select(.id != ${{ github.run_id }})] | length")
|
||||||
|
|
||||||
|
if [[ "$success_count" -gt 0 ]]; then
|
||||||
|
echo "Found $success_count prior successful CI run(s) for ${{ github.sha }}."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
in_progress_count=$(gh api \
|
||||||
|
"repos/${{ github.repository }}/actions/workflows/ci.yml/runs?head_sha=${{ github.sha }}&per_page=10" \
|
||||||
|
--jq "[.workflow_runs[] | select(.id != ${{ github.run_id }}) | select(.status == \"in_progress\" or .status == \"queued\" or .status == \"waiting\" or .status == \"requested\" or .status == \"pending\")] | length")
|
||||||
|
|
||||||
|
if [[ "$in_progress_count" -gt 0 ]]; then
|
||||||
|
echo "CI still in progress (attempt $attempt/$max_attempts), waiting 30s..."
|
||||||
|
sleep 30
|
||||||
|
else
|
||||||
|
echo "::error::No prior successful CI run found for ${{ github.sha }}. Only tag commits that have passed CI on main."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "::error::Timed out waiting for CI run to complete for ${{ github.sha }}."
|
||||||
|
exit 1
|
||||||
|
|
||||||
build-deploy:
|
build-deploy:
|
||||||
name: Build and Deploy
|
name: Build and Deploy
|
||||||
permissions:
|
permissions:
|
||||||
@@ -126,17 +208,21 @@ jobs:
|
|||||||
environment:
|
environment:
|
||||||
name: ${{ startsWith(github.ref, 'refs/tags/') && 'production' || 'acceptance' }}
|
name: ${{ startsWith(github.ref, 'refs/tags/') && 'production' || 'acceptance' }}
|
||||||
url: ${{ vars.URL }}
|
url: ${{ vars.URL }}
|
||||||
needs: [quality, tests]
|
needs: [quality, tests, verify-prior-run]
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
timeout-minutes: 15
|
timeout-minutes: 15
|
||||||
if: (github.ref == 'refs/heads/main' && false) || startsWith(github.ref, 'refs/tags/')
|
if: >-
|
||||||
|
always() && !cancelled() && !failure() &&
|
||||||
|
((github.ref == 'refs/heads/main' && false) || startsWith(github.ref, 'refs/tags/'))
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7
|
||||||
|
with:
|
||||||
|
persist-credentials: false
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4
|
||||||
- name: Log in to GitHub Container Registry
|
- name: Log in to GitHub Container Registry
|
||||||
uses: docker/login-action@v3
|
uses: docker/login-action@c99871dec2022cc055c062a10cc1a1310835ceb4 # v4
|
||||||
with:
|
with:
|
||||||
registry: ghcr.io
|
registry: ghcr.io
|
||||||
username: ${{ github.actor }}
|
username: ${{ github.actor }}
|
||||||
@@ -164,7 +250,7 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Build and Push Docker images
|
- name: Build and Push Docker images
|
||||||
uses: docker/bake-action@v5
|
uses: docker/bake-action@d3418bd7d0e9324001bca92fa8ba175ea7e6dc9b # v7
|
||||||
with:
|
with:
|
||||||
pull: true
|
pull: true
|
||||||
push: true
|
push: true
|
||||||
@@ -178,7 +264,7 @@ jobs:
|
|||||||
*.tags=${{ steps.meta.outputs.full_name }}
|
*.tags=${{ steps.meta.outputs.full_name }}
|
||||||
|
|
||||||
- name: Create Sentry release
|
- name: Create Sentry release
|
||||||
uses: getsentry/action-release@v3
|
uses: getsentry/action-release@ff07929a6537bac57790c3451cf4d364aca38528 # v3
|
||||||
env:
|
env:
|
||||||
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||||
SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
|
SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
|
||||||
@@ -191,5 +277,7 @@ jobs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
env:
|
env:
|
||||||
PORTAINER_WEBHOOK: ${{secrets.PORTAINER_WEBHOOK}}
|
PORTAINER_WEBHOOK: ${{secrets.PORTAINER_WEBHOOK}}
|
||||||
|
IMAGE_TAG: ${{steps.meta.outputs.tag}}
|
||||||
|
SENTRY_RELEASE: ${{steps.meta.outputs.sentry_version}}
|
||||||
run: |
|
run: |
|
||||||
curl -v -X POST "${PORTAINER_WEBHOOK}?IMAGE_TAG=${{steps.meta.outputs.tag}}" --fail-with-body
|
curl -v -X POST "${PORTAINER_WEBHOOK}?IMAGE_TAG=${IMAGE_TAG}&SENTRY_RELEASE=${SENTRY_RELEASE}" --fail-with-body
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Dependabot metadata
|
- name: Dependabot metadata
|
||||||
id: metadata
|
id: metadata
|
||||||
uses: dependabot/fetch-metadata@v2
|
uses: dependabot/fetch-metadata@v3
|
||||||
with:
|
with:
|
||||||
github-token: "${{ secrets.GITHUB_TOKEN }}"
|
github-token: "${{ secrets.GITHUB_TOKEN }}"
|
||||||
- name: Enable auto-merge for Dependabot PRs
|
- name: Enable auto-merge for Dependabot PRs
|
||||||
|
|||||||
@@ -51,6 +51,11 @@ reload-tests:
|
|||||||
@docker compose exec php bin/console --env=test doctrine:migrations:migrate -n
|
@docker compose exec php bin/console --env=test doctrine:migrations:migrate -n
|
||||||
@docker compose exec php bin/console --env=test doctrine:fixtures:load -n --group=test
|
@docker compose exec php bin/console --env=test doctrine:fixtures:load -n --group=test
|
||||||
|
|
||||||
|
install-hooks:
|
||||||
|
git config core.hooksPath .githooks
|
||||||
|
chmod +x .githooks/pre-commit
|
||||||
|
@echo "Pre-commit hook installed."
|
||||||
|
|
||||||
trust-cert:
|
trust-cert:
|
||||||
sudo security add-trusted-cer -d \
|
sudo security add-trusted-cer -d \
|
||||||
-r trustRoot \
|
-r trustRoot \
|
||||||
|
|||||||
@@ -1,39 +1,162 @@
|
|||||||
# Tijd voor de test
|
# Tijd voor de test
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
PHP/Symfony application for WIDM-style quiz management.
|
||||||
|
Built with FrankenPHP, PostgreSQL, and Docker.
|
||||||
|
|
||||||
|
> **Disclaimer:** This is an unofficial, non-commercial, open-source fan
|
||||||
|
> project. It is not affiliated with, endorsed by, or associated with
|
||||||
|
> *Wie is de Mol?* (produced by IDTV, broadcast by AVROTROS/NPO) or
|
||||||
|
> *De Mol* (produced by Woestijnvis, broadcast by Play/De Vijver Media).
|
||||||
|
> *Wie is de Mol?* and *De Mol* are trademarks of their respective rights
|
||||||
|
> holders. No copyright infringement is intended.
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
|
|
||||||
### Maken van de test
|
- Docker
|
||||||
|
- [Just](https://just.systems) (`brew install just`)
|
||||||
|
|
||||||
- WIDM-tests met een variabel aantal vragen.
|
## Local development
|
||||||
- Vragen in een vaste volgorde zijn samen één test (een vraag kan niet bij
|
|
||||||
meerdere tests horen).
|
|
||||||
- Vragen hebben 2 of meer antwoordmogelijkheden. Slechts één antwoord is correct.
|
|
||||||
- Meerdere test samen vormen een seizoen.
|
|
||||||
- Een seizoen heeft één of geen actieve tests, als er een test actief is kan
|
|
||||||
uitsluitend die test gemaakt worden.
|
|
||||||
- Kandidaten kunnen een test maximaal 1 keer invullen.
|
|
||||||
- Vanaf het moment dat de kandidaat op start klikt na het intypen van hun naam
|
|
||||||
gaat de tijd lopen. Deze stopt na het aanklikken van een antwoord op de laatste
|
|
||||||
vraag van de test.
|
|
||||||
- Achtergrondmuziek
|
|
||||||
|
|
||||||
### Schermen kijken
|
```bash
|
||||||
|
just up # Start PHP + PostgreSQL containers
|
||||||
|
just migrate # Run pending database migrations
|
||||||
|
just fixtures # Load dev fixtures (truncates first)
|
||||||
|
```
|
||||||
|
|
||||||
- Nadat een speler een test heeft gemaakt (of vooraf als de namen vooraf
|
The app is available at **https://localhost** (self-signed cert — run
|
||||||
ingevoerd zijn) kunnen jokers toegekend worden aan de test van kandidaat. Een
|
`just trust-cert` on macOS to trust it).
|
||||||
positief getal om antwoorden goed te rekenen, een negatief getal om
|
|
||||||
antwoorden fout te rekenen.
|
|
||||||
- Vooraf kan gekozen worden hoe veel afvallers er zijn.
|
|
||||||
- Bij het kijken naam rode en groene schermen wordt een naam ingevoerd. Er
|
|
||||||
wordt een rood of groen scherm getoond.
|
|
||||||
- Spelers kunnen geforceerd op groen of rood gezet worden, deze worden dan niet
|
|
||||||
meegenomen in de berekening van de slechtste speler.
|
|
||||||
|
|
||||||
### Statistieken
|
### Useful commands
|
||||||
|
|
||||||
TBD
|
```bash
|
||||||
|
just shell # Shell inside the running PHP container
|
||||||
|
just shell-run # Shell in a fresh one-off container
|
||||||
|
just stop # Stop containers (keep volumes)
|
||||||
|
just down # Stop and remove containers
|
||||||
|
just clean # Nuclear: remove containers + volumes + generated files
|
||||||
|
just exec <cmd> # Run any command inside the PHP container
|
||||||
|
```
|
||||||
|
|
||||||
## Nice to haves
|
### Environment
|
||||||
|
|
||||||
- Optie voor antwoord geven in twee klikken (selecteren en volgende).
|
Copy `.env` and override locally via `.env.local` (not committed):
|
||||||
|
|
||||||
|
| Variable | Description |
|
||||||
|
|----------------|-------------------------------------|
|
||||||
|
| `APP_SECRET` | Symfony app secret |
|
||||||
|
| `DATABASE_URL` | PostgreSQL DSN (auto-set in Docker) |
|
||||||
|
| `SENTRY_DSN` | Sentry error tracking |
|
||||||
|
| `DEFAULT_URI` | Base URL for CLI-generated links |
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
```bash
|
||||||
|
just test # Full PHPUnit suite
|
||||||
|
just test tests/Path/To/TestFile.php # Single file
|
||||||
|
just test --coverage-html var/coverage # HTML coverage report
|
||||||
|
just reload-tests # Drop/recreate test DB + migrate + test fixtures
|
||||||
|
```
|
||||||
|
|
||||||
|
Tests use a separate database configured via `.env.test`. The DAMA
|
||||||
|
Doctrine bundle wraps each test in a transaction that is rolled back after.
|
||||||
|
`just reload-tests` loads the `--group=test` fixtures; `just fixtures`
|
||||||
|
loads the dev group and is unrelated to the test database.
|
||||||
|
|
||||||
|
## Code quality
|
||||||
|
|
||||||
|
All checks run in CI and must pass before merging.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
just fix-cs # Auto-fix PHP-CS-Fixer + Twig-CS-Fixer
|
||||||
|
just phpstan # PHPStan static analysis (level 8)
|
||||||
|
just rector # Apply Rector modernizations
|
||||||
|
just rector --dry-run # Preview Rector changes without applying
|
||||||
|
```
|
||||||
|
|
||||||
|
## Database
|
||||||
|
|
||||||
|
```bash
|
||||||
|
just migrate # Run pending migrations
|
||||||
|
just fixtures # Load dev fixtures
|
||||||
|
bin/console make:migration # Generate a new migration (inside container)
|
||||||
|
```
|
||||||
|
|
||||||
|
Migrations live in `migrations/` (namespace `DoctrineMigrations`). Test
|
||||||
|
fixtures are in `src/DataFixtures/` loaded with `--group=test`.
|
||||||
|
|
||||||
|
## Translations
|
||||||
|
|
||||||
|
```bash
|
||||||
|
just translations # Extract/update nl translation strings into translations/
|
||||||
|
```
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
1. Create a branch from `main` — use a prefix like `feat/`, `fix/`,
|
||||||
|
or `docs/`.
|
||||||
|
2. Open a pull request; CI must pass before merging.
|
||||||
|
3. Install the pre-commit hook (see below) to catch issues before pushing.
|
||||||
|
|
||||||
|
### Pre-commit hook
|
||||||
|
|
||||||
|
A pre-commit hook lives in `.githooks/pre-commit`. Install it once after cloning:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
just install-hooks
|
||||||
|
```
|
||||||
|
|
||||||
|
On every commit it runs automatically, **only on staged files**:
|
||||||
|
|
||||||
|
| Staged file type | Tools run |
|
||||||
|
|-------------------------|------------------------------------------------------------------------------|
|
||||||
|
| `.php` | Rector → PHP-CS-Fixer (auto-fix + re-stage), then PHPStan (blocks on errors) |
|
||||||
|
| `.twig` | Twig-CS-Fixer (auto-fix + re-stage) |
|
||||||
|
| Other (docs, config, …) | Nothing — commit proceeds immediately |
|
||||||
|
|
||||||
|
If the PHP container is not running, the hook falls back to
|
||||||
|
`docker compose run --rm` so checks still execute. PHPUnit is not
|
||||||
|
run in the hook; CI covers that.
|
||||||
|
|
||||||
|
## Deployment
|
||||||
|
|
||||||
|
Docker images are published to `ghcr.io/marijndoeve/tijdvoordetest`
|
||||||
|
for each tagged release.
|
||||||
|
|
||||||
|
### First-time setup
|
||||||
|
|
||||||
|
1. Copy `compose.yaml` and `compose.prod.yaml` to your server.
|
||||||
|
2. Create a `.env.prod.local` file with the required variables (see below).
|
||||||
|
3. Start the stack — migrations run automatically on container start:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
IMAGE_TAG=latest docker compose -f compose.yaml -f compose.prod.yaml up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
### Updating to a new version
|
||||||
|
|
||||||
|
```bash
|
||||||
|
IMAGE_TAG=<tag> docker compose -f compose.yaml -f compose.prod.yaml pull
|
||||||
|
IMAGE_TAG=<tag> docker compose -f compose.yaml -f compose.prod.yaml up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
### Required environment variables
|
||||||
|
|
||||||
|
| Variable | Description |
|
||||||
|
|----------------------------|---------------------------------------------|
|
||||||
|
| `IMAGE_TAG` | Image tag to run (e.g. `1.2.3` or `latest`) |
|
||||||
|
| `APP_SECRET` | Random secret string for Symfony |
|
||||||
|
| `CADDY_MERCURE_JWT_SECRET` | JWT secret for the Mercure hub |
|
||||||
|
| `POSTGRES_PASSWORD` | PostgreSQL password |
|
||||||
|
| `MAILER_DSN` | Mailer transport DSN |
|
||||||
|
| `MAILER_SENDER` | From address for emails |
|
||||||
|
| `SENTRY_DSN` | Sentry project DSN (optional) |
|
||||||
|
|
||||||
|
The `compose.prod.yaml` configures Traefik labels for TLS termination at
|
||||||
|
`tijdvoordetest.nl`. Adjust the `traefik` labels in that file if you're
|
||||||
|
hosting on a different domain or using a different reverse proxy.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
[MIT](LICENSE)
|
||||||
|
|||||||
+1
-1
@@ -10,7 +10,7 @@ services:
|
|||||||
MAILER_DSN: ${MAILER_DSN}
|
MAILER_DSN: ${MAILER_DSN}
|
||||||
MAILER_SENDER: ${MAILER_SENDER}
|
MAILER_SENDER: ${MAILER_SENDER}
|
||||||
SENTRY_DSN: ${SENTRY_DSN}
|
SENTRY_DSN: ${SENTRY_DSN}
|
||||||
SENTRY_RELEASE: ${IMAGE_TAG}
|
SENTRY_RELEASE: ${SENTRY_RELEASE}
|
||||||
SENTRY_ENVIRONMENT: ${SENTRY_ENVIRONMENT}
|
SENTRY_ENVIRONMENT: ${SENTRY_ENVIRONMENT}
|
||||||
labels:
|
labels:
|
||||||
- "traefik.enable=true"
|
- "traefik.enable=true"
|
||||||
|
|||||||
Generated
+81
-79
@@ -1839,16 +1839,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "martin-georgiev/postgresql-for-doctrine",
|
"name": "martin-georgiev/postgresql-for-doctrine",
|
||||||
"version": "v4.6.0",
|
"version": "v4.7.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/martin-georgiev/postgresql-for-doctrine.git",
|
"url": "https://github.com/martin-georgiev/postgresql-for-doctrine.git",
|
||||||
"reference": "59841c7e53f8339b13bc0cb0ee9931b7b9bbb139"
|
"reference": "23b5c2694083355ab87eaa913b43a0cddd8c64bb"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/martin-georgiev/postgresql-for-doctrine/zipball/59841c7e53f8339b13bc0cb0ee9931b7b9bbb139",
|
"url": "https://api.github.com/repos/martin-georgiev/postgresql-for-doctrine/zipball/23b5c2694083355ab87eaa913b43a0cddd8c64bb",
|
||||||
"reference": "59841c7e53f8339b13bc0cb0ee9931b7b9bbb139",
|
"reference": "23b5c2694083355ab87eaa913b43a0cddd8c64bb",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -1863,13 +1863,13 @@
|
|||||||
"deptrac/deptrac": "^4.0",
|
"deptrac/deptrac": "^4.0",
|
||||||
"doctrine/orm": "~2.14||~3.0",
|
"doctrine/orm": "~2.14||~3.0",
|
||||||
"ekino/phpstan-banned-code": "^3.2.0",
|
"ekino/phpstan-banned-code": "^3.2.0",
|
||||||
"friendsofphp/php-cs-fixer": "^3.95.2",
|
"friendsofphp/php-cs-fixer": "^3.95.11",
|
||||||
"phpstan/phpstan": "^2.1.55",
|
"phpstan/phpstan": "^2.2.2",
|
||||||
"phpstan/phpstan-deprecation-rules": "^2.0.4",
|
"phpstan/phpstan-deprecation-rules": "^2.0.4",
|
||||||
"phpstan/phpstan-doctrine": "^2.0.22",
|
"phpstan/phpstan-doctrine": "^2.0.27",
|
||||||
"phpstan/phpstan-phpunit": "^2.0.16",
|
"phpstan/phpstan-phpunit": "^2.0.16",
|
||||||
"phpunit/phpunit": "^10.5.63||^11.5",
|
"phpunit/phpunit": "^10.5.63||^11.5",
|
||||||
"rector/rector": "^2.4.4",
|
"rector/rector": "^2.5.2",
|
||||||
"symfony/cache": "^6.4||^7.0",
|
"symfony/cache": "^6.4||^7.0",
|
||||||
"symfony/var-exporter": "^6.4||^7.0"
|
"symfony/var-exporter": "^6.4||^7.0"
|
||||||
},
|
},
|
||||||
@@ -1952,7 +1952,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/martin-georgiev/postgresql-for-doctrine/issues",
|
"issues": "https://github.com/martin-georgiev/postgresql-for-doctrine/issues",
|
||||||
"source": "https://github.com/martin-georgiev/postgresql-for-doctrine/tree/v4.6.0"
|
"source": "https://github.com/martin-georgiev/postgresql-for-doctrine/tree/v4.7.0"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -1964,7 +1964,7 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-05-29T19:11:20+00:00"
|
"time": "2026-07-01T18:17:39+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpdocumentor/reflection-common",
|
"name": "phpdocumentor/reflection-common",
|
||||||
@@ -9287,16 +9287,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "friendsofphp/php-cs-fixer",
|
"name": "friendsofphp/php-cs-fixer",
|
||||||
"version": "v3.95.8",
|
"version": "v3.95.11",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
|
"url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git",
|
||||||
"reference": "4140023f552ff02346df9b1329742532166f677f"
|
"reference": "35f98e1293283397824d7f349ce5afb8747c3cd5"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/4140023f552ff02346df9b1329742532166f677f",
|
"url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/35f98e1293283397824d7f349ce5afb8747c3cd5",
|
||||||
"reference": "4140023f552ff02346df9b1329742532166f677f",
|
"reference": "35f98e1293283397824d7f349ce5afb8747c3cd5",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -9330,7 +9330,7 @@
|
|||||||
"require-dev": {
|
"require-dev": {
|
||||||
"facile-it/paraunit": "^1.3.1 || ^2.11.0",
|
"facile-it/paraunit": "^1.3.1 || ^2.11.0",
|
||||||
"infection/infection": "^0.32.7",
|
"infection/infection": "^0.32.7",
|
||||||
"justinrainbow/json-schema": "^6.9.0",
|
"justinrainbow/json-schema": "^6.10.0",
|
||||||
"keradus/cli-executor": "^2.3",
|
"keradus/cli-executor": "^2.3",
|
||||||
"mikey179/vfsstream": "^1.6.12",
|
"mikey179/vfsstream": "^1.6.12",
|
||||||
"php-coveralls/php-coveralls": "^2.9.1",
|
"php-coveralls/php-coveralls": "^2.9.1",
|
||||||
@@ -9380,7 +9380,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
|
"issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues",
|
||||||
"source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.95.8"
|
"source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.95.11"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -9388,7 +9388,7 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-06-16T09:52:26+00:00"
|
"time": "2026-06-25T14:17:04+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "myclabs/deep-copy",
|
"name": "myclabs/deep-copy",
|
||||||
@@ -9676,11 +9676,11 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpstan/phpstan",
|
"name": "phpstan/phpstan",
|
||||||
"version": "2.2.2",
|
"version": "2.2.4",
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/e5cc34d491a90e79c216d824f60fe21fd4d93bd6",
|
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/f0fe3fb03bb53ce68cc2416785b260e62226ec27",
|
||||||
"reference": "e5cc34d491a90e79c216d824f60fe21fd4d93bd6",
|
"reference": "f0fe3fb03bb53ce68cc2416785b260e62226ec27",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -9736,7 +9736,7 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-06-05T09:00:01+00:00"
|
"time": "2026-07-03T07:00:23+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpstan/phpstan-doctrine",
|
"name": "phpstan/phpstan-doctrine",
|
||||||
@@ -9817,21 +9817,22 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpstan/phpstan-phpunit",
|
"name": "phpstan/phpstan-phpunit",
|
||||||
"version": "2.0.16",
|
"version": "2.0.17",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/phpstan/phpstan-phpunit.git",
|
"url": "https://github.com/phpstan/phpstan-phpunit.git",
|
||||||
"reference": "6ab598e1bc106e6827fd346ae4a12b4a5d634c32"
|
"reference": "c2f977551f0736d60467b3d754b2e0cf4e337b3f"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/6ab598e1bc106e6827fd346ae4a12b4a5d634c32",
|
"url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/c2f977551f0736d60467b3d754b2e0cf4e337b3f",
|
||||||
"reference": "6ab598e1bc106e6827fd346ae4a12b4a5d634c32",
|
"reference": "c2f977551f0736d60467b3d754b2e0cf4e337b3f",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
"phar-io/version": "^3.2",
|
||||||
"php": "^7.4 || ^8.0",
|
"php": "^7.4 || ^8.0",
|
||||||
"phpstan/phpstan": "^2.1.32"
|
"phpstan/phpstan": "^2.2.3"
|
||||||
},
|
},
|
||||||
"conflict": {
|
"conflict": {
|
||||||
"phpunit/phpunit": "<7.0"
|
"phpunit/phpunit": "<7.0"
|
||||||
@@ -9841,7 +9842,8 @@
|
|||||||
"php-parallel-lint/php-parallel-lint": "^1.2",
|
"php-parallel-lint/php-parallel-lint": "^1.2",
|
||||||
"phpstan/phpstan-deprecation-rules": "^2.0",
|
"phpstan/phpstan-deprecation-rules": "^2.0",
|
||||||
"phpstan/phpstan-strict-rules": "^2.0",
|
"phpstan/phpstan-strict-rules": "^2.0",
|
||||||
"phpunit/phpunit": "^9.6"
|
"phpunit/phpunit": "^9.6",
|
||||||
|
"shipmonk/name-collision-detector": "^2.1"
|
||||||
},
|
},
|
||||||
"type": "phpstan-extension",
|
"type": "phpstan-extension",
|
||||||
"extra": {
|
"extra": {
|
||||||
@@ -9867,9 +9869,9 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/phpstan/phpstan-phpunit/issues",
|
"issues": "https://github.com/phpstan/phpstan-phpunit/issues",
|
||||||
"source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.16"
|
"source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.17"
|
||||||
},
|
},
|
||||||
"time": "2026-02-14T09:05:21+00:00"
|
"time": "2026-06-29T05:32:23+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpstan/phpstan-symfony",
|
"name": "phpstan/phpstan-symfony",
|
||||||
@@ -10330,16 +10332,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "phpunit/phpunit",
|
"name": "phpunit/phpunit",
|
||||||
"version": "13.2.1",
|
"version": "13.2.2",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/sebastianbergmann/phpunit.git",
|
"url": "https://github.com/sebastianbergmann/phpunit.git",
|
||||||
"reference": "60da0ff1e10a0f72ee18a24117ec3b613a346bba"
|
"reference": "492c067e618de7b3c76105082c90f9d2833401b7"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/60da0ff1e10a0f72ee18a24117ec3b613a346bba",
|
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/492c067e618de7b3c76105082c90f9d2833401b7",
|
||||||
"reference": "60da0ff1e10a0f72ee18a24117ec3b613a346bba",
|
"reference": "492c067e618de7b3c76105082c90f9d2833401b7",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -10410,7 +10412,7 @@
|
|||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
|
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
|
||||||
"security": "https://github.com/sebastianbergmann/phpunit/security/policy",
|
"security": "https://github.com/sebastianbergmann/phpunit/security/policy",
|
||||||
"source": "https://github.com/sebastianbergmann/phpunit/tree/13.2.1"
|
"source": "https://github.com/sebastianbergmann/phpunit/tree/13.2.2"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -10418,7 +10420,7 @@
|
|||||||
"type": "other"
|
"type": "other"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-06-15T13:14:22+00:00"
|
"time": "2026-06-29T13:36:29+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "react/cache",
|
"name": "react/cache",
|
||||||
@@ -10948,16 +10950,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "rector/rector",
|
"name": "rector/rector",
|
||||||
"version": "2.4.6",
|
"version": "2.5.2",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/rectorphp/rector.git",
|
"url": "https://github.com/rectorphp/rector.git",
|
||||||
"reference": "9b9e5c76618e4d359f65b54ca2eabcad3d1761ee"
|
"reference": "49ff6339174bdbdf50b0b35ecbcff14a05ac9e24"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/rectorphp/rector/zipball/9b9e5c76618e4d359f65b54ca2eabcad3d1761ee",
|
"url": "https://api.github.com/repos/rectorphp/rector/zipball/49ff6339174bdbdf50b0b35ecbcff14a05ac9e24",
|
||||||
"reference": "9b9e5c76618e4d359f65b54ca2eabcad3d1761ee",
|
"reference": "49ff6339174bdbdf50b0b35ecbcff14a05ac9e24",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -10996,7 +10998,7 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/rectorphp/rector/issues",
|
"issues": "https://github.com/rectorphp/rector/issues",
|
||||||
"source": "https://github.com/rectorphp/rector/tree/2.4.6"
|
"source": "https://github.com/rectorphp/rector/tree/2.5.2"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -11004,7 +11006,7 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-06-17T11:56:28+00:00"
|
"time": "2026-06-22T11:39:33+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "sebastian/cli-parser",
|
"name": "sebastian/cli-parser",
|
||||||
@@ -12167,16 +12169,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/browser-kit",
|
"name": "symfony/browser-kit",
|
||||||
"version": "v8.1.0",
|
"version": "v8.1.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/browser-kit.git",
|
"url": "https://github.com/symfony/browser-kit.git",
|
||||||
"reference": "74e18e582cdda0eca35f7c74e1e48e62f0ede853"
|
"reference": "f2ac86001ca9f487e8c6d0e11c8e33e6a9b8b2d5"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/browser-kit/zipball/74e18e582cdda0eca35f7c74e1e48e62f0ede853",
|
"url": "https://api.github.com/repos/symfony/browser-kit/zipball/f2ac86001ca9f487e8c6d0e11c8e33e6a9b8b2d5",
|
||||||
"reference": "74e18e582cdda0eca35f7c74e1e48e62f0ede853",
|
"reference": "f2ac86001ca9f487e8c6d0e11c8e33e6a9b8b2d5",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -12215,7 +12217,7 @@
|
|||||||
"description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically",
|
"description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/browser-kit/tree/v8.1.0"
|
"source": "https://github.com/symfony/browser-kit/tree/v8.1.1"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -12235,7 +12237,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-05-29T05:06:50+00:00"
|
"time": "2026-06-09T10:54:51+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/css-selector",
|
"name": "symfony/css-selector",
|
||||||
@@ -12308,16 +12310,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/dom-crawler",
|
"name": "symfony/dom-crawler",
|
||||||
"version": "v8.1.0",
|
"version": "v8.1.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/dom-crawler.git",
|
"url": "https://github.com/symfony/dom-crawler.git",
|
||||||
"reference": "77ca351474ea018daba5f2e473cbf1b9b8e72ac6"
|
"reference": "1dfadd25537c8fcb6752cce5775f24647d976bdc"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/dom-crawler/zipball/77ca351474ea018daba5f2e473cbf1b9b8e72ac6",
|
"url": "https://api.github.com/repos/symfony/dom-crawler/zipball/1dfadd25537c8fcb6752cce5775f24647d976bdc",
|
||||||
"reference": "77ca351474ea018daba5f2e473cbf1b9b8e72ac6",
|
"reference": "1dfadd25537c8fcb6752cce5775f24647d976bdc",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -12354,7 +12356,7 @@
|
|||||||
"description": "Eases DOM navigation for HTML and XML documents",
|
"description": "Eases DOM navigation for HTML and XML documents",
|
||||||
"homepage": "https://symfony.com",
|
"homepage": "https://symfony.com",
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/dom-crawler/tree/v8.1.0"
|
"source": "https://github.com/symfony/dom-crawler/tree/v8.1.1"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -12374,7 +12376,7 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-05-29T05:06:50+00:00"
|
"time": "2026-06-05T06:23:12+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/maker-bundle",
|
"name": "symfony/maker-bundle",
|
||||||
@@ -12477,16 +12479,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/phpunit-bridge",
|
"name": "symfony/phpunit-bridge",
|
||||||
"version": "v8.1.0",
|
"version": "v8.1.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/phpunit-bridge.git",
|
"url": "https://github.com/symfony/phpunit-bridge.git",
|
||||||
"reference": "1fed488f8033f2dece371e60a1c66f2add274916"
|
"reference": "3e1c9a9167e07474ec115555b632f0ffadb0f94d"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/1fed488f8033f2dece371e60a1c66f2add274916",
|
"url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/3e1c9a9167e07474ec115555b632f0ffadb0f94d",
|
||||||
"reference": "1fed488f8033f2dece371e60a1c66f2add274916",
|
"reference": "3e1c9a9167e07474ec115555b632f0ffadb0f94d",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -12538,7 +12540,7 @@
|
|||||||
"testing"
|
"testing"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/phpunit-bridge/tree/v8.1.0"
|
"source": "https://github.com/symfony/phpunit-bridge/tree/v8.1.1"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -12558,20 +12560,20 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-05-29T05:06:50+00:00"
|
"time": "2026-06-09T10:54:51+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/web-profiler-bundle",
|
"name": "symfony/web-profiler-bundle",
|
||||||
"version": "v8.1.0",
|
"version": "v8.1.1",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/symfony/web-profiler-bundle.git",
|
"url": "https://github.com/symfony/web-profiler-bundle.git",
|
||||||
"reference": "f8ccea08797a511b85a698b0da40e1b9e6461086"
|
"reference": "eb4cf71d8fc496d790ec85b1b684a7ac30d57a96"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/f8ccea08797a511b85a698b0da40e1b9e6461086",
|
"url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/eb4cf71d8fc496d790ec85b1b684a7ac30d57a96",
|
||||||
"reference": "f8ccea08797a511b85a698b0da40e1b9e6461086",
|
"reference": "eb4cf71d8fc496d790ec85b1b684a7ac30d57a96",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -12623,7 +12625,7 @@
|
|||||||
"dev"
|
"dev"
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://github.com/symfony/web-profiler-bundle/tree/v8.1.0"
|
"source": "https://github.com/symfony/web-profiler-bundle/tree/v8.1.1"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -12643,27 +12645,27 @@
|
|||||||
"type": "tidelift"
|
"type": "tidelift"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-05-29T05:06:50+00:00"
|
"time": "2026-06-05T06:23:12+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "thecodingmachine/phpstan-safe-rule",
|
"name": "thecodingmachine/phpstan-safe-rule",
|
||||||
"version": "v1.4.3",
|
"version": "v1.4.7",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/thecodingmachine/phpstan-safe-rule.git",
|
"url": "https://github.com/thecodingmachine/phpstan-safe-rule.git",
|
||||||
"reference": "5c804889253ce9498ef185e108e9f94b6023208e"
|
"reference": "51fa2a35a270f683fc9ea53384a03e892b4d7b51"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/thecodingmachine/phpstan-safe-rule/zipball/5c804889253ce9498ef185e108e9f94b6023208e",
|
"url": "https://api.github.com/repos/thecodingmachine/phpstan-safe-rule/zipball/51fa2a35a270f683fc9ea53384a03e892b4d7b51",
|
||||||
"reference": "5c804889253ce9498ef185e108e9f94b6023208e",
|
"reference": "51fa2a35a270f683fc9ea53384a03e892b4d7b51",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"nikic/php-parser": "^5",
|
"nikic/php-parser": "^5",
|
||||||
"php": "^8.1",
|
"php": "^8.1",
|
||||||
"phpstan/phpstan": "^2.1.11",
|
"phpstan/phpstan": "^2.2.2",
|
||||||
"thecodingmachine/safe": "^1.2 || ^2.0 || ^3.0"
|
"thecodingmachine/safe": "^3.1"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"php-coveralls/php-coveralls": "^2.1",
|
"php-coveralls/php-coveralls": "^2.1",
|
||||||
@@ -12699,9 +12701,9 @@
|
|||||||
"description": "A PHPStan rule to detect safety issues. Must be used in conjunction with thecodingmachine/safe",
|
"description": "A PHPStan rule to detect safety issues. Must be used in conjunction with thecodingmachine/safe",
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/thecodingmachine/phpstan-safe-rule/issues",
|
"issues": "https://github.com/thecodingmachine/phpstan-safe-rule/issues",
|
||||||
"source": "https://github.com/thecodingmachine/phpstan-safe-rule/tree/v1.4.3"
|
"source": "https://github.com/thecodingmachine/phpstan-safe-rule/tree/v1.4.7"
|
||||||
},
|
},
|
||||||
"time": "2025-11-21T09:41:49+00:00"
|
"time": "2026-06-21T07:55:55+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "theseer/tokenizer",
|
"name": "theseer/tokenizer",
|
||||||
@@ -12755,16 +12757,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "vincentlanglet/twig-cs-fixer",
|
"name": "vincentlanglet/twig-cs-fixer",
|
||||||
"version": "4.0.1",
|
"version": "4.0.2",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/VincentLanglet/Twig-CS-Fixer.git",
|
"url": "https://github.com/VincentLanglet/Twig-CS-Fixer.git",
|
||||||
"reference": "366f7cca494a6f95c5f410ae542aef9c164d329e"
|
"reference": "1cb75618f7dd0f9bf51924aa6d3aa8c588f51d5a"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/VincentLanglet/Twig-CS-Fixer/zipball/366f7cca494a6f95c5f410ae542aef9c164d329e",
|
"url": "https://api.github.com/repos/VincentLanglet/Twig-CS-Fixer/zipball/1cb75618f7dd0f9bf51924aa6d3aa8c588f51d5a",
|
||||||
"reference": "366f7cca494a6f95c5f410ae542aef9c164d329e",
|
"reference": "1cb75618f7dd0f9bf51924aa6d3aa8c588f51d5a",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -12820,7 +12822,7 @@
|
|||||||
"homepage": "https://github.com/VincentLanglet/Twig-CS-Fixer",
|
"homepage": "https://github.com/VincentLanglet/Twig-CS-Fixer",
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/VincentLanglet/Twig-CS-Fixer/issues",
|
"issues": "https://github.com/VincentLanglet/Twig-CS-Fixer/issues",
|
||||||
"source": "https://github.com/VincentLanglet/Twig-CS-Fixer/tree/4.0.1"
|
"source": "https://github.com/VincentLanglet/Twig-CS-Fixer/tree/4.0.2"
|
||||||
},
|
},
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@@ -12828,7 +12830,7 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"time": "2026-06-18T15:31:27+00:00"
|
"time": "2026-06-29T15:22:14+00:00"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
|
|||||||
+4
-1
@@ -3,6 +3,7 @@
|
|||||||
declare(strict_types=1);
|
declare(strict_types=1);
|
||||||
|
|
||||||
use Rector\Config\RectorConfig;
|
use Rector\Config\RectorConfig;
|
||||||
|
use Rector\PHPUnit\CodeQuality\Rector\Class_\AddSeeTestAnnotationRector;
|
||||||
use Rector\Symfony\Bridge\Symfony\Routing\SymfonyRoutesProvider;
|
use Rector\Symfony\Bridge\Symfony\Routing\SymfonyRoutesProvider;
|
||||||
use Rector\Symfony\Contract\Bridge\Symfony\Routing\SymfonyRoutesProviderInterface;
|
use Rector\Symfony\Contract\Bridge\Symfony\Routing\SymfonyRoutesProviderInterface;
|
||||||
|
|
||||||
@@ -13,7 +14,7 @@ return RectorConfig::configure()
|
|||||||
__DIR__.'/src',
|
__DIR__.'/src',
|
||||||
__DIR__.'/tests',
|
__DIR__.'/tests',
|
||||||
])
|
])
|
||||||
->withSkip([__DIR__.'/config/reference.php'])
|
->withSkipPath(__DIR__.'/config/reference.php')
|
||||||
->withSymfonyContainerXml(__DIR__.'/var/cache/dev/Tvdt_KernelDevDebugContainer.xml')
|
->withSymfonyContainerXml(__DIR__.'/var/cache/dev/Tvdt_KernelDevDebugContainer.xml')
|
||||||
->withSymfonyContainerPhp(__DIR__.'/tests/symfony-container.php')
|
->withSymfonyContainerPhp(__DIR__.'/tests/symfony-container.php')
|
||||||
->registerService(SymfonyRoutesProvider::class, SymfonyRoutesProviderInterface::class)
|
->registerService(SymfonyRoutesProvider::class, SymfonyRoutesProviderInterface::class)
|
||||||
@@ -34,4 +35,6 @@ return RectorConfig::configure()
|
|||||||
)
|
)
|
||||||
->withAttributesSets(all: true)
|
->withAttributesSets(all: true)
|
||||||
->withComposerBased(twig: true, doctrine: true, phpunit: true, symfony: true)
|
->withComposerBased(twig: true, doctrine: true, phpunit: true, symfony: true)
|
||||||
|
->withSkip([AddSeeTestAnnotationRector::class])
|
||||||
|
|
||||||
;
|
;
|
||||||
|
|||||||
Reference in New Issue
Block a user