diff --git a/.dockerignore b/.dockerignore index b9393525..d036eb9d 100644 --- a/.dockerignore +++ b/.dockerignore @@ -12,3 +12,5 @@ /phpunit.xml /README.md /rector.php +/renovate.json +/version-bumper.yaml diff --git a/.gitattributes b/.gitattributes index 48f1a277..9c9f6305 100644 --- a/.gitattributes +++ b/.gitattributes @@ -15,3 +15,4 @@ /phpunit.xml export-ignore /rector.php export-ignore /renovate.json export-ignore +/version-bumper.yaml export-ignore diff --git a/.github/workflows/cgl.yaml b/.github/workflows/cgl.yaml index e7903785..f87db66a 100644 --- a/.github/workflows/cgl.yaml +++ b/.github/workflows/cgl.yaml @@ -21,7 +21,8 @@ jobs: - name: Setup PHP uses: shivammathur/setup-php@v2 with: - php-version: 8.2 + # @todo Use PHP 8.4 once PHP-CS-Fixer supports it + php-version: 8.3 tools: composer:v2, composer-require-checker, composer-unused, cs2pr coverage: none @@ -39,7 +40,7 @@ jobs: - name: Reset composer.json run: git checkout composer.json composer.lock - name: Re-install Composer dependencies - uses: ramsey/composer-install@v2 + uses: ramsey/composer-install@v3 - name: Check for unused dependencies run: composer-unused --excludePackage=nyholm/psr7 diff --git a/.github/workflows/documentation.yaml b/.github/workflows/documentation.yaml index 10935a19..b3c549a0 100644 --- a/.github/workflows/documentation.yaml +++ b/.github/workflows/documentation.yaml @@ -29,7 +29,7 @@ jobs: - name: Setup Pages uses: actions/configure-pages@v5 - name: Render documentation - run: docker-compose -f docs/_build/docker-compose.yaml run --rm build + run: docker compose -f docs/_build/docker-compose.yaml run --rm build - name: Upload artifact uses: actions/upload-pages-artifact@v3 with: diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 7f0dfb94..28322141 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -16,9 +16,17 @@ jobs: strategy: fail-fast: false matrix: - php-version: ["8.1", "8.2", "8.3"] - composer-version: ["2.1", "2.2", "2.3", "2.4", "2.5", "2.6", "2.7"] + php-version: ["8.1", "8.2", "8.3", "8.4"] + composer-version: ["2.1", "2.2", "2.3", "2.4", "2.5", "2.6", "2.7", "2.8"] dependencies: ["highest", "lowest"] + # Skip tests for PHP 8.4 and incompatible Composer versions + exclude: + - php-version: "8.4" + composer-version: "2.1" + - php-version: "8.4" + composer-version: "2.2" + - php-version: "8.4" + composer-version: "2.3" steps: - uses: actions/checkout@v4 with: @@ -34,11 +42,11 @@ jobs: # Install dependencies - name: Install Composer dependencies - uses: ramsey/composer-install@v2 + uses: ramsey/composer-install@v3 with: dependency-versions: ${{ matrix.dependencies }} # Composer < 2.7 is not compatible with symfony/console 7.x - composer-options: ${{ matrix.composer-version != '2.7' && '--with symfony/console:<7' }} + composer-options: ${{ matrix.composer-version < 2.7 && '--with symfony/console:<7' }} # Run tests - name: Run tests @@ -56,18 +64,15 @@ jobs: - name: Setup PHP uses: shivammathur/setup-php@v2 with: - php-version: 8.3 + php-version: 8.4 tools: composer:v2 coverage: pcov # Install dependencies - name: Install Composer dependencies - uses: ramsey/composer-install@v2 + uses: ramsey/composer-install@v3 with: dependency-versions: highest - # @todo Remove once Composer 2.7 is released and supported - # Composer < 2.7 is not compatible with symfony/console 7.x - composer-options: "--with symfony/console:<7" # Run Unit tests - name: Build coverage directory @@ -104,7 +109,7 @@ jobs: # CodeClimate - name: CodeClimate report - uses: paambaati/codeclimate-action@v8.0.0 + uses: paambaati/codeclimate-action@v9.0.0 if: env.CC_TEST_REPORTER_ID env: CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }} diff --git a/.php-cs-fixer.php b/.php-cs-fixer.php index c268c402..1d17f9c8 100644 --- a/.php-cs-fixer.php +++ b/.php-cs-fixer.php @@ -21,20 +21,21 @@ * along with this program. If not, see . */ -$config = new \PhpCsFixer\Config(); +$config = new PhpCsFixer\Config(); $config->getFinder() ->files() ->name('*.php') ->in(__DIR__) ->ignoreVCSIgnored(true) + ->ignoreDotFiles(false) ; -$ruleset = new \CPSIT\PhpCsFixerConfig\Rule\DefaultRuleset(); +$ruleset = new CPSIT\PhpCsFixerConfig\Rule\DefaultRuleset(); $ruleset->apply($config); // Enable parallel runs (PHP-CS-Fixer >= v3.57) -if (class_exists(\PhpCsFixer\Runner\Parallel\ParallelConfigFactory::class)) { - $config->setParallelConfig(\PhpCsFixer\Runner\Parallel\ParallelConfigFactory::detect()); +if (class_exists(PhpCsFixer\Runner\Parallel\ParallelConfigFactory::class)) { + $config->setParallelConfig(PhpCsFixer\Runner\Parallel\ParallelConfigFactory::detect()); } return $config; diff --git a/Dockerfile b/Dockerfile index 8da57fe7..fea040ee 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ -FROM composer/composer:2.7-bin AS composer +FROM composer/composer:2.8-bin AS composer LABEL maintainer="Elias Häußler " -FROM php:8.3-alpine +FROM php:8.4-alpine COPY --from=composer /composer /usr/bin/composer ENV COMPOSER_ALLOW_SUPERUSER=1 diff --git a/README.md b/README.md index 6a8202f6..975e2c10 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,7 @@ composer create-project cpsit/project-builder ### Docker [![Docker](https://img.shields.io/docker/v/cpsit/project-builder?label=version&logo=docker&sort=semver)](https://hub.docker.com/r/cpsit/project-builder) +[![GHCR Pulls](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fipitio.github.io%2Fbackage%2FCPS-IT%2Fproject-builder%2Fproject-builder.json&query=%24.downloads&label=GHCR%20pulls&color=brightgreen)](https://github.com/CPS-IT/project-builder/pkgs/container/project-builder) [![Docker Pulls](https://img.shields.io/docker/pulls/cpsit/project-builder?color=brightgreen)](https://hub.docker.com/r/cpsit/project-builder) ```bash diff --git a/composer.json b/composer.json index b47af12f..6bb1c26a 100644 --- a/composer.json +++ b/composer.json @@ -16,7 +16,7 @@ } ], "require": { - "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", "ext-filter": "*", "ext-json": "*", "ext-mbstring": "*", @@ -32,7 +32,7 @@ "psr/http-message": "^1.0 || ^2.0", "sebastianfeldmann/cli": "^3.4", "symfony/config": "^5.4 || ^6.0 || ^7.0", - "symfony/console": "^5.4 || ^6.0", + "symfony/console": "^5.4 || ^6.0 || ^7.0", "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0", "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0", "symfony/expression-language": "^5.4 || ^6.0 || ^7.0", @@ -50,6 +50,7 @@ "composer/xdebug-handler": "^3.0", "cpsit/php-cs-fixer-config": "^1.1", "donatj/mock-webserver": "^2.5", + "eliashaeussler/version-bumper": "^1.2", "ergebnis/composer-normalize": "^2.26", "phpstan/extension-installer": "^1.2", "phpstan/phpstan": "^1.9", @@ -74,6 +75,7 @@ }, "config": { "allow-plugins": { + "eliashaeussler/version-bumper": true, "ergebnis/composer-normalize": true, "phpstan/extension-installer": true }, diff --git a/composer.lock b/composer.lock index fec49f7d..28f223e6 100644 --- a/composer.lock +++ b/composer.lock @@ -4,25 +4,25 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "1dfab5c540f38a67aa16f01cd8951308", + "content-hash": "db2260a7fd531684a7e404787a15601b", "packages": [ { "name": "cocur/slugify", - "version": "v4.5.1", + "version": "v4.6.0", "source": { "type": "git", "url": "https://github.com/cocur/slugify.git", - "reference": "7c6e088228b9f082050876ae8b0cd287b117b840" + "reference": "1d674022e9cbefa80b4f51aa3e2375b6e3c14fdb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/cocur/slugify/zipball/7c6e088228b9f082050876ae8b0cd287b117b840", - "reference": "7c6e088228b9f082050876ae8b0cd287b117b840", + "url": "https://api.github.com/repos/cocur/slugify/zipball/1d674022e9cbefa80b4f51aa3e2375b6e3c14fdb", + "reference": "1d674022e9cbefa80b4f51aa3e2375b6e3c14fdb", "shasum": "" }, "require": { "ext-mbstring": "*", - "php": "~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + "php": "~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" }, "conflict": { "symfony/config": "<3.4 || >=4,<4.3", @@ -76,27 +76,27 @@ ], "support": { "issues": "https://github.com/cocur/slugify/issues", - "source": "https://github.com/cocur/slugify/tree/v4.5.1" + "source": "https://github.com/cocur/slugify/tree/v4.6.0" }, - "time": "2023-09-17T07:26:20+00:00" + "time": "2024-09-10T14:09:25+00:00" }, { "name": "cuyz/valinor", - "version": "1.12.0", + "version": "1.14.1", "source": { "type": "git", "url": "https://github.com/CuyZ/Valinor.git", - "reference": "3bc40798a5ff64aee8a28509b73f7f84d5c66ac9" + "reference": "12033fccdcc6afa7e73b3e234e4d6656530f2bcb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CuyZ/Valinor/zipball/3bc40798a5ff64aee8a28509b73f7f84d5c66ac9", - "reference": "3bc40798a5ff64aee8a28509b73f7f84d5c66ac9", + "url": "https://api.github.com/repos/CuyZ/Valinor/zipball/12033fccdcc6afa7e73b3e234e4d6656530f2bcb", + "reference": "12033fccdcc6afa7e73b3e234e4d6656530f2bcb", "shasum": "" }, "require": { "composer-runtime-api": "^2.0", - "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", "psr/simple-cache": "^1.0 || ^2.0 || ^3.0" }, "require-dev": { @@ -143,7 +143,7 @@ ], "support": { "issues": "https://github.com/CuyZ/Valinor/issues", - "source": "https://github.com/CuyZ/Valinor/tree/1.12.0" + "source": "https://github.com/CuyZ/Valinor/tree/1.14.1" }, "funding": [ { @@ -151,26 +151,26 @@ "type": "github" } ], - "time": "2024-04-04T16:42:55+00:00" + "time": "2024-11-06T07:46:46+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "7.8.1", + "version": "7.9.2", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "41042bc7ab002487b876a0683fc8dce04ddce104" + "reference": "d281ed313b989f213357e3be1a179f02196ac99b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104", - "reference": "41042bc7ab002487b876a0683fc8dce04ddce104", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.5.3 || ^2.0.1", - "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", + "guzzlehttp/promises": "^1.5.3 || ^2.0.3", + "guzzlehttp/psr7": "^2.7.0", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" @@ -181,9 +181,9 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "ext-curl": "*", - "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "guzzle/client-integration-tests": "3.0.2", "php-http/message-factory": "^1.1", - "phpunit/phpunit": "^8.5.36 || ^9.6.15", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { @@ -261,7 +261,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.8.1" + "source": "https://github.com/guzzle/guzzle/tree/7.9.2" }, "funding": [ { @@ -277,20 +277,20 @@ "type": "tidelift" } ], - "time": "2023-12-03T20:35:24+00:00" + "time": "2024-07-24T11:22:20+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.0.2", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223" + "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223", - "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223", + "url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455", + "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455", "shasum": "" }, "require": { @@ -298,7 +298,7 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.36 || ^9.6.15" + "phpunit/phpunit": "^8.5.39 || ^9.6.20" }, "type": "library", "extra": { @@ -344,7 +344,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.2" + "source": "https://github.com/guzzle/promises/tree/2.0.4" }, "funding": [ { @@ -360,20 +360,20 @@ "type": "tidelift" } ], - "time": "2023-12-03T20:19:20+00:00" + "time": "2024-10-17T10:06:22+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.6.2", + "version": "2.7.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221" + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221", - "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", "shasum": "" }, "require": { @@ -388,8 +388,8 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "http-interop/http-factory-tests": "^0.9", - "phpunit/phpunit": "^8.5.36 || ^9.6.15" + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" @@ -460,7 +460,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.6.2" + "source": "https://github.com/guzzle/psr7/tree/2.7.0" }, "funding": [ { @@ -476,20 +476,20 @@ "type": "tidelift" } ], - "time": "2023-12-03T20:05:35+00:00" + "time": "2024-07-18T11:15:46+00:00" }, { "name": "nyholm/psr7", - "version": "1.8.1", + "version": "1.8.2", "source": { "type": "git", "url": "https://github.com/Nyholm/psr7.git", - "reference": "aa5fc277a4f5508013d571341ade0c3886d4d00e" + "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Nyholm/psr7/zipball/aa5fc277a4f5508013d571341ade0c3886d4d00e", - "reference": "aa5fc277a4f5508013d571341ade0c3886d4d00e", + "url": "https://api.github.com/repos/Nyholm/psr7/zipball/a71f2b11690f4b24d099d6b16690a90ae14fc6f3", + "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3", "shasum": "" }, "require": { @@ -542,7 +542,7 @@ ], "support": { "issues": "https://github.com/Nyholm/psr7/issues", - "source": "https://github.com/Nyholm/psr7/tree/1.8.1" + "source": "https://github.com/Nyholm/psr7/tree/1.8.2" }, "funding": [ { @@ -554,7 +554,7 @@ "type": "github" } ], - "time": "2023-11-13T09:31:12+00:00" + "time": "2024-09-09T07:06:30+00:00" }, { "name": "opis/json-schema", @@ -1060,16 +1060,16 @@ }, { "name": "psr/log", - "version": "3.0.0", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", - "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", "shasum": "" }, "require": { @@ -1104,9 +1104,9 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/3.0.0" + "source": "https://github.com/php-fig/log/tree/3.0.2" }, - "time": "2021-07-14T16:46:02+00:00" + "time": "2024-09-11T13:17:53+00:00" }, { "name": "psr/simple-cache", @@ -1263,16 +1263,16 @@ }, { "name": "symfony/cache", - "version": "v6.4.8", + "version": "v6.4.14", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "287142df5579ce223c485b3872df3efae8390984" + "reference": "36fb8aa88833708e9f29014b6f15fac051a8b613" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/287142df5579ce223c485b3872df3efae8390984", - "reference": "287142df5579ce223c485b3872df3efae8390984", + "url": "https://api.github.com/repos/symfony/cache/zipball/36fb8aa88833708e9f29014b6f15fac051a8b613", + "reference": "36fb8aa88833708e9f29014b6f15fac051a8b613", "shasum": "" }, "require": { @@ -1339,7 +1339,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v6.4.8" + "source": "https://github.com/symfony/cache/tree/v6.4.14" }, "funding": [ { @@ -1355,7 +1355,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-11-05T15:34:40+00:00" }, { "name": "symfony/cache-contracts", @@ -1435,16 +1435,16 @@ }, { "name": "symfony/config", - "version": "v6.4.8", + "version": "v6.4.14", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "12e7e52515ce37191b193cf3365903c4f3951e35" + "reference": "4e55e7e4ffddd343671ea972216d4509f46c22ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/12e7e52515ce37191b193cf3365903c4f3951e35", - "reference": "12e7e52515ce37191b193cf3365903c4f3951e35", + "url": "https://api.github.com/repos/symfony/config/zipball/4e55e7e4ffddd343671ea972216d4509f46c22ef", + "reference": "4e55e7e4ffddd343671ea972216d4509f46c22ef", "shasum": "" }, "require": { @@ -1490,7 +1490,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v6.4.8" + "source": "https://github.com/symfony/config/tree/v6.4.14" }, "funding": [ { @@ -1506,20 +1506,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-11-04T11:33:53+00:00" }, { "name": "symfony/console", - "version": "v6.4.9", + "version": "v6.4.15", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "6edb5363ec0c78ad4d48c5128ebf4d083d89d3a9" + "reference": "f1fc6f47283e27336e7cebb9e8946c8de7bff9bd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/6edb5363ec0c78ad4d48c5128ebf4d083d89d3a9", - "reference": "6edb5363ec0c78ad4d48c5128ebf4d083d89d3a9", + "url": "https://api.github.com/repos/symfony/console/zipball/f1fc6f47283e27336e7cebb9e8946c8de7bff9bd", + "reference": "f1fc6f47283e27336e7cebb9e8946c8de7bff9bd", "shasum": "" }, "require": { @@ -1584,7 +1584,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.9" + "source": "https://github.com/symfony/console/tree/v6.4.15" }, "funding": [ { @@ -1600,20 +1600,20 @@ "type": "tidelift" } ], - "time": "2024-06-28T09:49:33+00:00" + "time": "2024-11-06T14:19:14+00:00" }, { "name": "symfony/dependency-injection", - "version": "v6.4.9", + "version": "v6.4.15", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "a4df9dfe5da2d177af6643610c7bee2cb76a9f5e" + "reference": "70ab1f65a4516ef741e519ea938e6aa465e6aa36" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/a4df9dfe5da2d177af6643610c7bee2cb76a9f5e", - "reference": "a4df9dfe5da2d177af6643610c7bee2cb76a9f5e", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/70ab1f65a4516ef741e519ea938e6aa465e6aa36", + "reference": "70ab1f65a4516ef741e519ea938e6aa465e6aa36", "shasum": "" }, "require": { @@ -1665,7 +1665,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v6.4.9" + "source": "https://github.com/symfony/dependency-injection/tree/v6.4.15" }, "funding": [ { @@ -1681,7 +1681,7 @@ "type": "tidelift" } ], - "time": "2024-06-19T10:45:28+00:00" + "time": "2024-11-09T06:56:25+00:00" }, { "name": "symfony/deprecation-contracts", @@ -1752,16 +1752,16 @@ }, { "name": "symfony/event-dispatcher", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "8d7507f02b06e06815e56bb39aa0128e3806208b" + "reference": "0ffc48080ab3e9132ea74ef4e09d8dcf26bf897e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8d7507f02b06e06815e56bb39aa0128e3806208b", - "reference": "8d7507f02b06e06815e56bb39aa0128e3806208b", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/0ffc48080ab3e9132ea74ef4e09d8dcf26bf897e", + "reference": "0ffc48080ab3e9132ea74ef4e09d8dcf26bf897e", "shasum": "" }, "require": { @@ -1812,7 +1812,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.8" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.13" }, "funding": [ { @@ -1828,7 +1828,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -1908,16 +1908,16 @@ }, { "name": "symfony/expression-language", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/expression-language.git", - "reference": "0b63cb437741a42104d3ccc9bf60bbd8e1acbd2a" + "reference": "3524904fb026356a5230cd197f9a4e6a61e0e7df" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/expression-language/zipball/0b63cb437741a42104d3ccc9bf60bbd8e1acbd2a", - "reference": "0b63cb437741a42104d3ccc9bf60bbd8e1acbd2a", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/3524904fb026356a5230cd197f9a4e6a61e0e7df", + "reference": "3524904fb026356a5230cd197f9a4e6a61e0e7df", "shasum": "" }, "require": { @@ -1952,7 +1952,7 @@ "description": "Provides an engine that can compile and evaluate expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/expression-language/tree/v6.4.8" + "source": "https://github.com/symfony/expression-language/tree/v6.4.13" }, "funding": [ { @@ -1968,20 +1968,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-10-09T08:40:40+00:00" }, { "name": "symfony/filesystem", - "version": "v6.4.9", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "b51ef8059159330b74a4d52f68e671033c0fe463" + "reference": "4856c9cf585d5a0313d8d35afd681a526f038dd3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/b51ef8059159330b74a4d52f68e671033c0fe463", - "reference": "b51ef8059159330b74a4d52f68e671033c0fe463", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/4856c9cf585d5a0313d8d35afd681a526f038dd3", + "reference": "4856c9cf585d5a0313d8d35afd681a526f038dd3", "shasum": "" }, "require": { @@ -2018,7 +2018,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.9" + "source": "https://github.com/symfony/filesystem/tree/v6.4.13" }, "funding": [ { @@ -2034,20 +2034,20 @@ "type": "tidelift" } ], - "time": "2024-06-28T09:49:33+00:00" + "time": "2024-10-25T15:07:50+00:00" }, { "name": "symfony/finder", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "3ef977a43883215d560a2cecb82ec8e62131471c" + "reference": "daea9eca0b08d0ed1dc9ab702a46128fd1be4958" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/3ef977a43883215d560a2cecb82ec8e62131471c", - "reference": "3ef977a43883215d560a2cecb82ec8e62131471c", + "url": "https://api.github.com/repos/symfony/finder/zipball/daea9eca0b08d0ed1dc9ab702a46128fd1be4958", + "reference": "daea9eca0b08d0ed1dc9ab702a46128fd1be4958", "shasum": "" }, "require": { @@ -2082,7 +2082,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v6.4.8" + "source": "https://github.com/symfony/finder/tree/v6.4.13" }, "funding": [ { @@ -2098,24 +2098,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-10-01T08:30:56+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "0424dff1c58f028c451efff2045f5d92410bd540" + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/0424dff1c58f028c451efff2045f5d92410bd540", - "reference": "0424dff1c58f028c451efff2045f5d92410bd540", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-ctype": "*" @@ -2161,7 +2161,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" }, "funding": [ { @@ -2177,24 +2177,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a" + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/64647a7c30b2283f5d49b874d84a18fc22054b7a", - "reference": "64647a7c30b2283f5d49b874d84a18fc22054b7a", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" @@ -2239,7 +2239,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" }, "funding": [ { @@ -2255,24 +2255,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb" + "reference": "3833d7255cc303546435cb650316bff708a1c75c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/a95281b0be0d9ab48050ebd988b967875cdb9fdb", - "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" @@ -2320,7 +2320,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" }, "funding": [ { @@ -2336,24 +2336,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c" + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c", - "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-mbstring": "*" @@ -2400,7 +2400,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" }, "funding": [ { @@ -2416,24 +2416,24 @@ "type": "tidelift" } ], - "time": "2024-06-19T12:30:46+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "symfony/polyfill-php80", - "version": "v1.30.0", + "name": "symfony/polyfill-php81", + "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "77fa7995ac1b21ab60769b7323d600a991a90433" + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/77fa7995ac1b21ab60769b7323d600a991a90433", - "reference": "77fa7995ac1b21ab60769b7323d600a991a90433", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { @@ -2447,7 +2447,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" + "Symfony\\Polyfill\\Php81\\": "" }, "classmap": [ "Resources/stubs" @@ -2458,10 +2458,6 @@ "MIT" ], "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, { "name": "Nicolas Grekas", "email": "p@tchwork.com" @@ -2471,7 +2467,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -2480,7 +2476,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-php81/tree/v1.31.0" }, "funding": [ { @@ -2496,20 +2492,20 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/process", - "version": "v6.4.8", + "version": "v6.4.15", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5" + "reference": "3cb242f059c14ae08591c5c4087d1fe443564392" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/8d92dd79149f29e89ee0f480254db595f6a6a2c5", - "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5", + "url": "https://api.github.com/repos/symfony/process/zipball/3cb242f059c14ae08591c5c4087d1fe443564392", + "reference": "3cb242f059c14ae08591c5c4087d1fe443564392", "shasum": "" }, "require": { @@ -2541,7 +2537,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.8" + "source": "https://github.com/symfony/process/tree/v6.4.15" }, "funding": [ { @@ -2557,7 +2553,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-11-06T14:19:14+00:00" }, { "name": "symfony/service-contracts", @@ -2644,16 +2640,16 @@ }, { "name": "symfony/string", - "version": "v6.4.9", + "version": "v6.4.15", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "76792dbd99690a5ebef8050d9206c60c59e681d7" + "reference": "73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/76792dbd99690a5ebef8050d9206c60c59e681d7", - "reference": "76792dbd99690a5ebef8050d9206c60c59e681d7", + "url": "https://api.github.com/repos/symfony/string/zipball/73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f", + "reference": "73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f", "shasum": "" }, "require": { @@ -2710,7 +2706,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.9" + "source": "https://github.com/symfony/string/tree/v6.4.15" }, "funding": [ { @@ -2726,20 +2722,20 @@ "type": "tidelift" } ], - "time": "2024-06-28T09:25:38+00:00" + "time": "2024-11-13T13:31:12+00:00" }, { "name": "symfony/var-exporter", - "version": "v6.4.9", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "f9a060622e0d93777b7f8687ec4860191e16802e" + "reference": "0f605f72a363f8743001038a176eeb2a11223b51" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/f9a060622e0d93777b7f8687ec4860191e16802e", - "reference": "f9a060622e0d93777b7f8687ec4860191e16802e", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/0f605f72a363f8743001038a176eeb2a11223b51", + "reference": "0f605f72a363f8743001038a176eeb2a11223b51", "shasum": "" }, "require": { @@ -2787,7 +2783,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.4.9" + "source": "https://github.com/symfony/var-exporter/tree/v6.4.13" }, "funding": [ { @@ -2803,20 +2799,20 @@ "type": "tidelift" } ], - "time": "2024-06-24T15:53:56+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/yaml", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "52903de178d542850f6f341ba92995d3d63e60c9" + "reference": "e99b4e94d124b29ee4cf3140e1b537d2dad8cec9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/52903de178d542850f6f341ba92995d3d63e60c9", - "reference": "52903de178d542850f6f341ba92995d3d63e60c9", + "url": "https://api.github.com/repos/symfony/yaml/zipball/e99b4e94d124b29ee4cf3140e1b537d2dad8cec9", + "reference": "e99b4e94d124b29ee4cf3140e1b537d2dad8cec9", "shasum": "" }, "require": { @@ -2859,7 +2855,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.4.8" + "source": "https://github.com/symfony/yaml/tree/v6.4.13" }, "funding": [ { @@ -2875,28 +2871,28 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "twig/twig", - "version": "v3.10.3", + "version": "v3.15.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "67f29781ffafa520b0bbfbd8384674b42db04572" + "reference": "2d5b3964cc21d0188633d7ddce732dc8e874db02" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/67f29781ffafa520b0bbfbd8384674b42db04572", - "reference": "67f29781ffafa520b0bbfbd8384674b42db04572", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/2d5b3964cc21d0188633d7ddce732dc8e874db02", + "reference": "2d5b3964cc21d0188633d7ddce732dc8e874db02", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.0.2", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8", "symfony/polyfill-mbstring": "^1.3", - "symfony/polyfill-php80": "^1.22" + "symfony/polyfill-php81": "^1.29" }, "require-dev": { "psr/container": "^1.0|^2.0", @@ -2942,7 +2938,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.10.3" + "source": "https://github.com/twigphp/Twig/tree/v3.15.0" }, "funding": [ { @@ -2954,7 +2950,7 @@ "type": "tidelift" } ], - "time": "2024-05-16T10:04:27+00:00" + "time": "2024-11-17T15:59:19+00:00" }, { "name": "webmozart/assert", @@ -3140,16 +3136,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.5.1", + "version": "1.5.3", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "063d9aa8696582f5a41dffbbaf3c81024f0a604a" + "reference": "3b1fc3f0be055baa7c6258b1467849c3e8204eb2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/063d9aa8696582f5a41dffbbaf3c81024f0a604a", - "reference": "063d9aa8696582f5a41dffbbaf3c81024f0a604a", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/3b1fc3f0be055baa7c6258b1467849c3e8204eb2", + "reference": "3b1fc3f0be055baa7c6258b1467849c3e8204eb2", "shasum": "" }, "require": { @@ -3159,8 +3155,8 @@ }, "require-dev": { "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8 || ^9", "psr/log": "^1.0 || ^2.0 || ^3.0", - "symfony/phpunit-bridge": "^4.2 || ^5", "symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0" }, "type": "library", @@ -3196,7 +3192,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.5.1" + "source": "https://github.com/composer/ca-bundle/tree/1.5.3" }, "funding": [ { @@ -3212,20 +3208,20 @@ "type": "tidelift" } ], - "time": "2024-07-08T15:28:20+00:00" + "time": "2024-11-04T10:15:26+00:00" }, { "name": "composer/class-map-generator", - "version": "1.3.4", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/composer/class-map-generator.git", - "reference": "b1b3fd0b4eaf3ddf3ee230bc340bf3fff454a1a3" + "reference": "98bbf6780e56e0fd2404fe4b82eb665a0f93b783" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/b1b3fd0b4eaf3ddf3ee230bc340bf3fff454a1a3", - "reference": "b1b3fd0b4eaf3ddf3ee230bc340bf3fff454a1a3", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/98bbf6780e56e0fd2404fe4b82eb665a0f93b783", + "reference": "98bbf6780e56e0fd2404fe4b82eb665a0f93b783", "shasum": "" }, "require": { @@ -3238,8 +3234,8 @@ "phpstan/phpstan-deprecation-rules": "^1", "phpstan/phpstan-phpunit": "^1", "phpstan/phpstan-strict-rules": "^1.1", - "symfony/filesystem": "^5.4 || ^6", - "symfony/phpunit-bridge": "^5" + "phpunit/phpunit": "^8", + "symfony/filesystem": "^5.4 || ^6" }, "type": "library", "extra": { @@ -3269,7 +3265,7 @@ ], "support": { "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.3.4" + "source": "https://github.com/composer/class-map-generator/tree/1.4.0" }, "funding": [ { @@ -3285,52 +3281,52 @@ "type": "tidelift" } ], - "time": "2024-06-12T14:13:04+00:00" + "time": "2024-10-03T18:14:00+00:00" }, { "name": "composer/composer", - "version": "2.7.7", + "version": "2.8.3", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "291942978f39435cf904d33739f98d7d4eca7b23" + "reference": "2a7c71266b2545a3bed9f4860734081963f6e688" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/291942978f39435cf904d33739f98d7d4eca7b23", - "reference": "291942978f39435cf904d33739f98d7d4eca7b23", + "url": "https://api.github.com/repos/composer/composer/zipball/2a7c71266b2545a3bed9f4860734081963f6e688", + "reference": "2a7c71266b2545a3bed9f4860734081963f6e688", "shasum": "" }, "require": { - "composer/ca-bundle": "^1.0", - "composer/class-map-generator": "^1.3.3", + "composer/ca-bundle": "^1.5", + "composer/class-map-generator": "^1.4.0", "composer/metadata-minifier": "^1.0", - "composer/pcre": "^2.1 || ^3.1", + "composer/pcre": "^2.2 || ^3.2", "composer/semver": "^3.3", "composer/spdx-licenses": "^1.5.7", "composer/xdebug-handler": "^2.0.2 || ^3.0.3", - "justinrainbow/json-schema": "^5.2.11", + "justinrainbow/json-schema": "^5.3", "php": "^7.2.5 || ^8.0", "psr/log": "^1.0 || ^2.0 || ^3.0", - "react/promise": "^2.8 || ^3", + "react/promise": "^2.11 || ^3.2", "seld/jsonlint": "^1.4", "seld/phar-utils": "^1.2", "seld/signal-handler": "^2.0", - "symfony/console": "^5.4.11 || ^6.0.11 || ^7", - "symfony/filesystem": "^5.4 || ^6.0 || ^7", - "symfony/finder": "^5.4 || ^6.0 || ^7", + "symfony/console": "^5.4.35 || ^6.3.12 || ^7.0.3", + "symfony/filesystem": "^5.4.35 || ^6.3.12 || ^7.0.3", + "symfony/finder": "^5.4.35 || ^6.3.12 || ^7.0.3", "symfony/polyfill-php73": "^1.24", "symfony/polyfill-php80": "^1.24", "symfony/polyfill-php81": "^1.24", - "symfony/process": "^5.4 || ^6.0 || ^7" + "symfony/process": "^5.4.35 || ^6.3.12 || ^7.0.3" }, "require-dev": { - "phpstan/phpstan": "^1.11.0", + "phpstan/phpstan": "^1.11.8", "phpstan/phpstan-deprecation-rules": "^1.2.0", "phpstan/phpstan-phpunit": "^1.4.0", "phpstan/phpstan-strict-rules": "^1.6.0", "phpstan/phpstan-symfony": "^1.4.0", - "symfony/phpunit-bridge": "^6.4.1 || ^7.0.1" + "symfony/phpunit-bridge": "^6.4.3 || ^7.0.1" }, "suggest": { "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", @@ -3343,7 +3339,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.7-dev" + "dev-main": "2.8-dev" }, "phpstan": { "includes": [ @@ -3383,7 +3379,7 @@ "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", "security": "https://github.com/composer/composer/security/policy", - "source": "https://github.com/composer/composer/tree/2.7.7" + "source": "https://github.com/composer/composer/tree/2.8.3" }, "funding": [ { @@ -3399,7 +3395,7 @@ "type": "tidelift" } ], - "time": "2024-06-10T20:11:12+00:00" + "time": "2024-11-17T12:13:04+00:00" }, { "name": "composer/metadata-minifier", @@ -3472,30 +3468,38 @@ }, { "name": "composer/pcre", - "version": "3.1.4", + "version": "3.3.2", "source": { "type": "git", "url": "https://github.com/composer/pcre.git", - "reference": "04229f163664973f68f38f6f73d917799168ef24" + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/pcre/zipball/04229f163664973f68f38f6f73d917799168ef24", - "reference": "04229f163664973f68f38f6f73d917799168ef24", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", "shasum": "" }, "require": { "php": "^7.4 || ^8.0" }, + "conflict": { + "phpstan/phpstan": "<1.11.10" + }, "require-dev": { - "phpstan/phpstan": "^1.3", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^5" + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", + "phpunit/phpunit": "^8 || ^9" }, "type": "library", "extra": { "branch-alias": { "dev-main": "3.x-dev" + }, + "phpstan": { + "includes": [ + "extension.neon" + ] } }, "autoload": { @@ -3523,7 +3527,7 @@ ], "support": { "issues": "https://github.com/composer/pcre/issues", - "source": "https://github.com/composer/pcre/tree/3.1.4" + "source": "https://github.com/composer/pcre/tree/3.3.2" }, "funding": [ { @@ -3539,28 +3543,28 @@ "type": "tidelift" } ], - "time": "2024-05-27T13:40:54+00:00" + "time": "2024-11-12T16:29:46+00:00" }, { "name": "composer/semver", - "version": "3.4.2", + "version": "3.4.3", "source": { "type": "git", "url": "https://github.com/composer/semver.git", - "reference": "c51258e759afdb17f1fd1fe83bc12baaef6309d6" + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/c51258e759afdb17f1fd1fe83bc12baaef6309d6", - "reference": "c51258e759afdb17f1fd1fe83bc12baaef6309d6", + "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", "shasum": "" }, "require": { "php": "^5.3.2 || ^7.0 || ^8.0" }, "require-dev": { - "phpstan/phpstan": "^1.4", - "symfony/phpunit-bridge": "^4.2 || ^5" + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" }, "type": "library", "extra": { @@ -3604,7 +3608,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.4.2" + "source": "https://github.com/composer/semver/tree/3.4.3" }, "funding": [ { @@ -3620,7 +3624,7 @@ "type": "tidelift" } ], - "time": "2024-07-12T11:35:52+00:00" + "time": "2024-09-19T14:15:21+00:00" }, { "name": "composer/spdx-licenses", @@ -3770,21 +3774,21 @@ }, { "name": "cpsit/php-cs-fixer-config", - "version": "1.1.0", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/CPS-IT/php-cs-fixer-config.git", - "reference": "6bc0b94688dc21e897e3f6297b02b43f6bea9755" + "reference": "ce51940f501753387160c25d83852e4a71f5bb76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CPS-IT/php-cs-fixer-config/zipball/6bc0b94688dc21e897e3f6297b02b43f6bea9755", - "reference": "6bc0b94688dc21e897e3f6297b02b43f6bea9755", + "url": "https://api.github.com/repos/CPS-IT/php-cs-fixer-config/zipball/ce51940f501753387160c25d83852e4a71f5bb76", + "reference": "ce51940f501753387160c25d83852e4a71f5bb76", "shasum": "" }, "require": { "friendsofphp/php-cs-fixer": "^3.14", - "php": "~8.1.0 || ~8.2.0 || ~8.3.0" + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" }, "require-dev": { "armin/editorconfig-cli": "^1.8 || ^2.0", @@ -3794,8 +3798,8 @@ "phpstan/phpstan-deprecation-rules": "^1.1", "phpstan/phpstan-phpunit": "^1.3", "phpstan/phpstan-strict-rules": "^1.5", - "phpunit/phpunit": "^10.5", - "rector/rector": "^0.18.13" + "phpunit/phpunit": "^10.1 || ^11.0", + "rector/rector": "^1.0.0" }, "type": "library", "autoload": { @@ -3818,9 +3822,72 @@ "description": "Shared PHP-CS-Fixer configuration for CPS projects", "support": { "issues": "https://github.com/CPS-IT/php-cs-fixer-config/issues", - "source": "https://github.com/CPS-IT/php-cs-fixer-config/tree/1.1.0" + "source": "https://github.com/CPS-IT/php-cs-fixer-config/tree/1.2.0" + }, + "time": "2024-11-07T07:08:55+00:00" + }, + { + "name": "cypresslab/gitelephant", + "version": "v4.5.0", + "source": { + "type": "git", + "url": "https://github.com/matteosister/GitElephant.git", + "reference": "6f396bdb41fa0b2e5e414e16188f6eb107021947" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/matteosister/GitElephant/zipball/6f396bdb41fa0b2e5e414e16188f6eb107021947", + "reference": "6f396bdb41fa0b2e5e414e16188f6eb107021947", + "shasum": "" + }, + "require": { + "php": ">=7.2.0", + "phpcollection/phpcollection": "~0.4|~0.5", + "symfony/filesystem": ">=3.4", + "symfony/finder": ">=3.4", + "symfony/process": ">=3.4" + }, + "require-dev": { + "mockery/mockery": "~1.1", + "php": ">=7.2.0", + "phpstan/phpstan": "*", + "phpstan/phpstan-phpunit": "*", + "phpunit/phpunit": "~8.0|~9.0", + "rector/rector": "*", + "symplify/easy-coding-standard": "*" + }, + "type": "library", + "autoload": { + "psr-0": { + "GitElephant": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0+" + ], + "authors": [ + { + "name": "Matteo Giachino", + "email": "matteog@gmail.com" + } + ], + "description": "An abstraction layer for git written in PHP", + "homepage": "http://gitelephant.cypresslab.net/", + "keywords": [ + "git" + ], + "support": { + "issues": "https://github.com/matteosister/GitElephant/issues", + "source": "https://github.com/matteosister/GitElephant/tree/v4.5.0" }, - "time": "2023-12-29T10:59:18+00:00" + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/cypresslab/gitelephant", + "type": "tidelift" + } + ], + "time": "2022-10-08T12:56:52+00:00" }, { "name": "donatj/mock-webserver", @@ -3898,18 +3965,81 @@ ], "time": "2024-01-22T20:41:09+00:00" }, + { + "name": "eliashaeussler/version-bumper", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/eliashaeussler/version-bumper.git", + "reference": "dfaa257fd0fc30c2ae81ae23760e743d5cc3f869" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/eliashaeussler/version-bumper/zipball/dfaa257fd0fc30c2ae81ae23760e743d5cc3f869", + "reference": "dfaa257fd0fc30c2ae81ae23760e743d5cc3f869", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.0", + "cuyz/valinor": "^1.0", + "cypresslab/gitelephant": "^4.5", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", + "symfony/console": "^5.4 || ^6.4 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.4 || ^7.0", + "symfony/yaml": "^5.4 || ^6.4 || ^7.0" + }, + "require-dev": { + "armin/editorconfig-cli": "^1.8 || ^2.0", + "composer/composer": "^2.2", + "eliashaeussler/php-cs-fixer-config": "^2.0", + "eliashaeussler/phpstan-config": "^2.0", + "eliashaeussler/rector-config": "^3.0", + "ergebnis/composer-normalize": "^2.30", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-symfony": "^1.4", + "phpunit/phpunit": "^10.2 || ^11.0" + }, + "type": "composer-plugin", + "extra": { + "class": "EliasHaeussler\\VersionBumper\\VersionBumperPlugin" + }, + "autoload": { + "psr-4": { + "EliasHaeussler\\VersionBumper\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-or-later" + ], + "authors": [ + { + "name": "Elias Häußler", + "email": "elias@haeussler.dev", + "homepage": "https://haeussler.dev", + "role": "Maintainer" + } + ], + "description": "Composer plugin to bump project versions during release preparations", + "support": { + "issues": "https://github.com/eliashaeussler/version-bumper/issues", + "source": "https://github.com/eliashaeussler/version-bumper/tree/1.3.1" + }, + "time": "2024-11-25T20:28:40+00:00" + }, { "name": "ergebnis/composer-normalize", - "version": "2.43.0", + "version": "2.44.0", "source": { "type": "git", "url": "https://github.com/ergebnis/composer-normalize.git", - "reference": "4b46330c84bb8f43fac79f5c5a05162fc7c80d75" + "reference": "bd0c446426bb837ae0cc9f97948167e658bd11d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/composer-normalize/zipball/4b46330c84bb8f43fac79f5c5a05162fc7c80d75", - "reference": "4b46330c84bb8f43fac79f5c5a05162fc7c80d75", + "url": "https://api.github.com/repos/ergebnis/composer-normalize/zipball/bd0c446426bb837ae0cc9f97948167e658bd11d2", + "reference": "bd0c446426bb837ae0cc9f97948167e658bd11d2", "shasum": "" }, "require": { @@ -3920,20 +4050,20 @@ "ext-json": "*", "justinrainbow/json-schema": "^5.2.12", "localheinz/diff": "^1.1.1", - "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" }, "require-dev": { "composer/composer": "^2.7.7", - "ergebnis/license": "^2.4.0", - "ergebnis/php-cs-fixer-config": "^6.30.1", - "ergebnis/phpunit-slow-test-detector": "^2.14.0", + "ergebnis/license": "^2.5.0", + "ergebnis/php-cs-fixer-config": "^6.37.0", + "ergebnis/phpunit-slow-test-detector": "^2.16.0", "fakerphp/faker": "^1.23.1", "infection/infection": "~0.26.6", - "phpunit/phpunit": "^9.6.19", + "phpunit/phpunit": "^9.6.20", "psalm/plugin-phpunit": "~0.19.0", - "rector/rector": "^1.1.0", - "symfony/filesystem": "^5.4.40", - "vimeo/psalm": "^5.24.0" + "rector/rector": "^1.2.5", + "symfony/filesystem": "^5.4.41", + "vimeo/psalm": "^5.26.1" }, "type": "composer-plugin", "extra": { @@ -3973,37 +4103,40 @@ "security": "https://github.com/ergebnis/composer-normalize/blob/main/.github/SECURITY.md", "source": "https://github.com/ergebnis/composer-normalize" }, - "time": "2024-06-16T13:22:18+00:00" + "time": "2024-09-30T21:56:22+00:00" }, { "name": "ergebnis/json", - "version": "1.2.0", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/ergebnis/json.git", - "reference": "a457f25a5ba7ea11fc94f84d53678c5211abfce0" + "reference": "7656ac2aa6c2ca4408f96f599e9a17a22c464f69" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/json/zipball/a457f25a5ba7ea11fc94f84d53678c5211abfce0", - "reference": "a457f25a5ba7ea11fc94f84d53678c5211abfce0", + "url": "https://api.github.com/repos/ergebnis/json/zipball/7656ac2aa6c2ca4408f96f599e9a17a22c464f69", + "reference": "7656ac2aa6c2ca4408f96f599e9a17a22c464f69", "shasum": "" }, "require": { "ext-json": "*", - "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" }, "require-dev": { - "ergebnis/data-provider": "^3.2.0", - "ergebnis/license": "^2.4.0", - "ergebnis/php-cs-fixer-config": "^6.20.0", - "ergebnis/phpunit-slow-test-detector": "^2.9.0", - "fakerphp/faker": "^1.23.1", + "ergebnis/data-provider": "^3.3.0", + "ergebnis/license": "^2.5.0", + "ergebnis/php-cs-fixer-config": "^6.37.0", + "ergebnis/phpunit-slow-test-detector": "^2.16.1", + "fakerphp/faker": "^1.24.0", "infection/infection": "~0.26.6", - "phpunit/phpunit": "^9.6.16", - "psalm/plugin-phpunit": "~0.18.4", - "rector/rector": "~0.19.2", - "vimeo/psalm": "^5.20.0" + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.10", + "phpstan/phpstan-deprecation-rules": "^1.2.1", + "phpstan/phpstan-phpunit": "^1.4.0", + "phpstan/phpstan-strict-rules": "^1.6.1", + "phpunit/phpunit": "^9.6.18", + "rector/rector": "^1.2.10" }, "type": "library", "extra": { @@ -4038,20 +4171,20 @@ "security": "https://github.com/ergebnis/json/blob/main/.github/SECURITY.md", "source": "https://github.com/ergebnis/json" }, - "time": "2024-01-29T15:09:24+00:00" + "time": "2024-11-17T11:51:22+00:00" }, { "name": "ergebnis/json-normalizer", - "version": "4.5.0", + "version": "4.7.0", "source": { "type": "git", "url": "https://github.com/ergebnis/json-normalizer.git", - "reference": "f0ee9e70739f121b27fac8b743e4a52b23de2152" + "reference": "36d86389095736944a5954ec440552bbe92e425f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/json-normalizer/zipball/f0ee9e70739f121b27fac8b743e4a52b23de2152", - "reference": "f0ee9e70739f121b27fac8b743e4a52b23de2152", + "url": "https://api.github.com/repos/ergebnis/json-normalizer/zipball/36d86389095736944a5954ec440552bbe92e425f", + "reference": "36d86389095736944a5954ec440552bbe92e425f", "shasum": "" }, "require": { @@ -4061,25 +4194,38 @@ "ergebnis/json-schema-validator": "^4.2.0", "ext-json": "*", "justinrainbow/json-schema": "^5.2.12", - "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" }, "require-dev": { - "composer/semver": "^3.4.0", - "ergebnis/data-provider": "^3.2.0", - "ergebnis/license": "^2.4.0", - "ergebnis/php-cs-fixer-config": "^6.20.0", - "ergebnis/phpunit-slow-test-detector": "^2.9.0", - "fakerphp/faker": "^1.23.1", + "composer/semver": "^3.4.3", + "ergebnis/composer-normalize": "^2.44.0", + "ergebnis/data-provider": "^3.3.0", + "ergebnis/license": "^2.5.0", + "ergebnis/php-cs-fixer-config": "^6.37.0", + "ergebnis/phpunit-slow-test-detector": "^2.16.1", + "fakerphp/faker": "^1.24.0", "infection/infection": "~0.26.6", - "phpunit/phpunit": "^9.6.16", - "psalm/plugin-phpunit": "~0.18.4", - "rector/rector": "~0.19.4", - "vimeo/psalm": "^5.20.0" + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.10", + "phpstan/phpstan-deprecation-rules": "^1.2.1", + "phpstan/phpstan-phpunit": "^1.4.0", + "phpstan/phpstan-strict-rules": "^1.6.1", + "phpunit/phpunit": "^9.6.19", + "rector/rector": "^1.2.10" }, "suggest": { "composer/semver": "If you want to use ComposerJsonNormalizer or VersionConstraintNormalizer" }, "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.7-dev" + }, + "composer-normalize": { + "indent-size": 2, + "indent-style": "space" + } + }, "autoload": { "psr-4": { "Ergebnis\\Json\\Normalizer\\": "src/" @@ -4107,39 +4253,46 @@ "security": "https://github.com/ergebnis/json-normalizer/blob/main/.github/SECURITY.md", "source": "https://github.com/ergebnis/json-normalizer" }, - "time": "2024-01-30T09:10:15+00:00" + "time": "2024-11-17T20:34:42+00:00" }, { "name": "ergebnis/json-pointer", - "version": "3.4.0", + "version": "3.6.0", "source": { "type": "git", "url": "https://github.com/ergebnis/json-pointer.git", - "reference": "b654757d873050622c2166f55ab25d04685261c5" + "reference": "4fc85d8edb74466d282119d8d9541ec7cffc0798" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/json-pointer/zipball/b654757d873050622c2166f55ab25d04685261c5", - "reference": "b654757d873050622c2166f55ab25d04685261c5", + "url": "https://api.github.com/repos/ergebnis/json-pointer/zipball/4fc85d8edb74466d282119d8d9541ec7cffc0798", + "reference": "4fc85d8edb74466d282119d8d9541ec7cffc0798", "shasum": "" }, "require": { - "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" }, "require-dev": { + "ergebnis/composer-normalize": "^2.43.0", "ergebnis/data-provider": "^3.2.0", "ergebnis/license": "^2.4.0", - "ergebnis/php-cs-fixer-config": "^6.20.0", - "ergebnis/phpunit-slow-test-detector": "^2.9.0", + "ergebnis/php-cs-fixer-config": "^6.32.0", + "ergebnis/phpunit-slow-test-detector": "^2.15.0", "fakerphp/faker": "^1.23.1", "infection/infection": "~0.26.6", - "phpunit/phpunit": "^9.6.16", - "psalm/plugin-phpunit": "~0.18.4", - "rector/rector": "~0.19.2", - "vimeo/psalm": "^5.20.0" + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.10", + "phpstan/phpstan-deprecation-rules": "^1.2.1", + "phpstan/phpstan-phpunit": "^1.4.0", + "phpstan/phpstan-strict-rules": "^1.6.1", + "phpunit/phpunit": "^9.6.19", + "rector/rector": "^1.2.10" }, "type": "library", "extra": { + "branch-alias": { + "dev-main": "3.6-dev" + }, "composer-normalize": { "indent-size": 2, "indent-style": "space" @@ -4173,38 +4326,41 @@ "security": "https://github.com/ergebnis/json-pointer/blob/main/.github/SECURITY.md", "source": "https://github.com/ergebnis/json-pointer" }, - "time": "2024-01-29T16:37:15+00:00" + "time": "2024-11-17T12:37:06+00:00" }, { "name": "ergebnis/json-printer", - "version": "3.5.0", + "version": "3.7.0", "source": { "type": "git", "url": "https://github.com/ergebnis/json-printer.git", - "reference": "549e16fe6de34b8c3aee7b421be12caa552f3ced" + "reference": "ced41fce7854152f0e8f38793c2ffe59513cdd82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/json-printer/zipball/549e16fe6de34b8c3aee7b421be12caa552f3ced", - "reference": "549e16fe6de34b8c3aee7b421be12caa552f3ced", + "url": "https://api.github.com/repos/ergebnis/json-printer/zipball/ced41fce7854152f0e8f38793c2ffe59513cdd82", + "reference": "ced41fce7854152f0e8f38793c2ffe59513cdd82", "shasum": "" }, "require": { "ext-json": "*", "ext-mbstring": "*", - "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" }, "require-dev": { - "ergebnis/data-provider": "^3.2.0", - "ergebnis/license": "^2.4.0", - "ergebnis/php-cs-fixer-config": "^6.20.0", - "ergebnis/phpunit-slow-test-detector": "^2.9.0", - "fakerphp/faker": "^1.23.1", + "ergebnis/data-provider": "^3.3.0", + "ergebnis/license": "^2.5.0", + "ergebnis/php-cs-fixer-config": "^6.37.0", + "ergebnis/phpunit-slow-test-detector": "^2.16.1", + "fakerphp/faker": "^1.24.0", "infection/infection": "~0.26.6", - "phpunit/phpunit": "^9.6.16", - "psalm/plugin-phpunit": "~0.18.4", - "rector/rector": "~0.19.2", - "vimeo/psalm": "^5.20.0" + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.10", + "phpstan/phpstan-deprecation-rules": "^1.2.1", + "phpstan/phpstan-phpunit": "^1.4.1", + "phpstan/phpstan-strict-rules": "^1.6.1", + "phpunit/phpunit": "^9.6.21", + "rector/rector": "^1.2.10" }, "type": "library", "autoload": { @@ -4235,43 +4391,50 @@ "security": "https://github.com/ergebnis/json-printer/blob/main/.github/SECURITY.md", "source": "https://github.com/ergebnis/json-printer" }, - "time": "2024-01-29T15:33:37+00:00" + "time": "2024-11-17T11:20:51+00:00" }, { "name": "ergebnis/json-schema-validator", - "version": "4.2.0", + "version": "4.4.0", "source": { "type": "git", "url": "https://github.com/ergebnis/json-schema-validator.git", - "reference": "10ed514fdc3f9b71f8a92c567afea21a2f6fa1ef" + "reference": "85f90c81f718aebba1d738800af83eeb447dc7ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/json-schema-validator/zipball/10ed514fdc3f9b71f8a92c567afea21a2f6fa1ef", - "reference": "10ed514fdc3f9b71f8a92c567afea21a2f6fa1ef", + "url": "https://api.github.com/repos/ergebnis/json-schema-validator/zipball/85f90c81f718aebba1d738800af83eeb447dc7ec", + "reference": "85f90c81f718aebba1d738800af83eeb447dc7ec", "shasum": "" }, "require": { "ergebnis/json": "^1.2.0", "ergebnis/json-pointer": "^3.4.0", "ext-json": "*", - "justinrainbow/json-schema": "^5.2.12", - "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + "justinrainbow/json-schema": "^5.2.12 || ^6.0.0", + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" }, "require-dev": { - "ergebnis/data-provider": "^3.2.0", - "ergebnis/license": "^2.4.0", - "ergebnis/php-cs-fixer-config": "^6.20.0", - "ergebnis/phpunit-slow-test-detector": "^2.9.0", - "fakerphp/faker": "^1.23.1", + "ergebnis/composer-normalize": "^2.44.0", + "ergebnis/data-provider": "^3.3.0", + "ergebnis/license": "^2.5.0", + "ergebnis/php-cs-fixer-config": "^6.37.0", + "ergebnis/phpunit-slow-test-detector": "^2.16.1", + "fakerphp/faker": "^1.24.0", "infection/infection": "~0.26.6", - "phpunit/phpunit": "^9.6.16", - "psalm/plugin-phpunit": "~0.18.4", - "rector/rector": "~0.19.2", - "vimeo/psalm": "^5.20.0" + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.10", + "phpstan/phpstan-deprecation-rules": "^1.2.1", + "phpstan/phpstan-phpunit": "^1.4.0", + "phpstan/phpstan-strict-rules": "^1.6.1", + "phpunit/phpunit": "^9.6.20", + "rector/rector": "^1.2.10" }, "type": "library", "extra": { + "branch-alias": { + "dev-main": "4.4-dev" + }, "composer-normalize": { "indent-size": 2, "indent-style": "space" @@ -4305,7 +4468,7 @@ "security": "https://github.com/ergebnis/json-schema-validator/blob/main/.github/SECURITY.md", "source": "https://github.com/ergebnis/json-schema-validator" }, - "time": "2024-01-29T16:50:15+00:00" + "time": "2024-11-18T06:32:28+00:00" }, { "name": "evenement/evenement", @@ -4356,16 +4519,16 @@ }, { "name": "fidry/cpu-core-counter", - "version": "1.1.0", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/theofidry/cpu-core-counter.git", - "reference": "f92996c4d5c1a696a6a970e20f7c4216200fcc42" + "reference": "8520451a140d3f46ac33042715115e290cf5785f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/f92996c4d5c1a696a6a970e20f7c4216200fcc42", - "reference": "f92996c4d5c1a696a6a970e20f7c4216200fcc42", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f", + "reference": "8520451a140d3f46ac33042715115e290cf5785f", "shasum": "" }, "require": { @@ -4405,7 +4568,7 @@ ], "support": { "issues": "https://github.com/theofidry/cpu-core-counter/issues", - "source": "https://github.com/theofidry/cpu-core-counter/tree/1.1.0" + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0" }, "funding": [ { @@ -4413,20 +4576,20 @@ "type": "github" } ], - "time": "2024-02-07T09:43:46+00:00" + "time": "2024-08-06T10:04:20+00:00" }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.59.3", + "version": "v3.65.0", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "30ba9ecc2b0e5205e578fe29973c15653d9bfd29" + "reference": "79d4f3e77b250a7d8043d76c6af8f0695e8a469f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/30ba9ecc2b0e5205e578fe29973c15653d9bfd29", - "reference": "30ba9ecc2b0e5205e578fe29973c15653d9bfd29", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/79d4f3e77b250a7d8043d76c6af8f0695e8a469f", + "reference": "79d4f3e77b250a7d8043d76c6af8f0695e8a469f", "shasum": "" }, "require": { @@ -4436,7 +4599,7 @@ "ext-filter": "*", "ext-json": "*", "ext-tokenizer": "*", - "fidry/cpu-core-counter": "^1.0", + "fidry/cpu-core-counter": "^1.2", "php": "^7.4 || ^8.0", "react/child-process": "^0.6.5", "react/event-loop": "^1.0", @@ -4456,18 +4619,18 @@ "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0" }, "require-dev": { - "facile-it/paraunit": "^1.3 || ^2.3", - "infection/infection": "^0.29.5", - "justinrainbow/json-schema": "^5.2", + "facile-it/paraunit": "^1.3.1 || ^2.4", + "infection/infection": "^0.29.8", + "justinrainbow/json-schema": "^5.3 || ^6.0", "keradus/cli-executor": "^2.1", - "mikey179/vfsstream": "^1.6.11", + "mikey179/vfsstream": "^1.6.12", "php-coveralls/php-coveralls": "^2.7", "php-cs-fixer/accessible-object": "^1.1", "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.5", "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.5", - "phpunit/phpunit": "^9.6.19 || ^10.5.21 || ^11.2", - "symfony/var-dumper": "^5.4 || ^6.0 || ^7.0", - "symfony/yaml": "^5.4 || ^6.0 || ^7.0" + "phpunit/phpunit": "^9.6.21 || ^10.5.38 || ^11.4.3", + "symfony/var-dumper": "^5.4.47 || ^6.4.15 || ^7.1.8", + "symfony/yaml": "^5.4.45 || ^6.4.13 || ^7.1.6" }, "suggest": { "ext-dom": "For handling output formats in XML", @@ -4508,7 +4671,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.59.3" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.65.0" }, "funding": [ { @@ -4516,7 +4679,7 @@ "type": "github" } ], - "time": "2024-06-16T14:17:03+00:00" + "time": "2024-11-25T00:39:24+00:00" }, { "name": "idiosyncratic/editorconfig", @@ -4694,16 +4857,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.12.0", + "version": "1.12.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", - "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845", + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845", "shasum": "" }, "require": { @@ -4742,7 +4905,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1" }, "funding": [ { @@ -4750,20 +4913,20 @@ "type": "tidelift" } ], - "time": "2024-06-12T14:39:25+00:00" + "time": "2024-11-08T17:47:46+00:00" }, { "name": "nikic/php-parser", - "version": "v5.1.0", + "version": "v5.3.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1" + "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/683130c2ff8c2739f4822ff7ac5c873ec529abd1", - "reference": "683130c2ff8c2739f4822ff7ac5c873ec529abd1", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/8eea230464783aa9671db8eea6f8c6ac5285794b", + "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b", "shasum": "" }, "require": { @@ -4806,9 +4969,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.1.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.3.1" }, - "time": "2024-07-01T20:03:41+00:00" + "time": "2024-10-08T18:51:32+00:00" }, { "name": "phar-io/manifest", @@ -4928,24 +5091,154 @@ }, "time": "2022-02-21T01:04:05+00:00" }, + { + "name": "phpcollection/phpcollection", + "version": "0.6.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-collection.git", + "reference": "56d18c8c2c0400f2838703246ac7de919a605763" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-collection/zipball/56d18c8c2c0400f2838703246ac7de919a605763", + "reference": "56d18c8c2c0400f2838703246ac7de919a605763", + "shasum": "" + }, + "require": { + "phpoption/phpoption": "1.*" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.4-dev" + } + }, + "autoload": { + "psr-0": { + "PhpCollection": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache2" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "General-Purpose Collection Library for PHP", + "keywords": [ + "collection", + "list", + "map", + "sequence", + "set" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-collection/issues", + "source": "https://github.com/schmittjoh/php-collection/tree/0.6.0" + }, + "time": "2022-03-21T13:02:41+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.9.3", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/e3fac8b24f56113f7cb96af14958c0dd16330f54", + "reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + }, + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.9.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2024-07-20T21:41:07+00:00" + }, { "name": "phpstan/extension-installer", - "version": "1.4.1", + "version": "1.4.3", "source": { "type": "git", "url": "https://github.com/phpstan/extension-installer.git", - "reference": "f6b87faf9fc7978eab2f7919a8760bc9f58f9203" + "reference": "85e90b3942d06b2326fba0403ec24fe912372936" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/extension-installer/zipball/f6b87faf9fc7978eab2f7919a8760bc9f58f9203", - "reference": "f6b87faf9fc7978eab2f7919a8760bc9f58f9203", + "url": "https://api.github.com/repos/phpstan/extension-installer/zipball/85e90b3942d06b2326fba0403ec24fe912372936", + "reference": "85e90b3942d06b2326fba0403ec24fe912372936", "shasum": "" }, "require": { "composer-plugin-api": "^2.0", "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.9.0" + "phpstan/phpstan": "^1.9.0 || ^2.0" }, "require-dev": { "composer/composer": "^2.0", @@ -4966,24 +5259,28 @@ "MIT" ], "description": "Composer plugin for automatic installation of PHPStan extensions", + "keywords": [ + "dev", + "static analysis" + ], "support": { "issues": "https://github.com/phpstan/extension-installer/issues", - "source": "https://github.com/phpstan/extension-installer/tree/1.4.1" + "source": "https://github.com/phpstan/extension-installer/tree/1.4.3" }, - "time": "2024-06-10T08:20:49+00:00" + "time": "2024-09-04T20:21:43+00:00" }, { "name": "phpstan/phpstan", - "version": "1.11.7", + "version": "1.12.11", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "52d2bbfdcae7f895915629e4694e9497d0f8e28d" + "reference": "0d1fc20a962a91be578bcfe7cf939e6e1a2ff733" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/52d2bbfdcae7f895915629e4694e9497d0f8e28d", - "reference": "52d2bbfdcae7f895915629e4694e9497d0f8e28d", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/0d1fc20a962a91be578bcfe7cf939e6e1a2ff733", + "reference": "0d1fc20a962a91be578bcfe7cf939e6e1a2ff733", "shasum": "" }, "require": { @@ -5028,25 +5325,25 @@ "type": "github" } ], - "time": "2024-07-06T11:17:41+00:00" + "time": "2024-11-17T14:08:01+00:00" }, { "name": "phpstan/phpstan-deprecation-rules", - "version": "1.2.0", + "version": "1.2.1", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-deprecation-rules.git", - "reference": "fa8cce7720fa782899a0aa97b6a41225d1bb7b26" + "reference": "f94d246cc143ec5a23da868f8f7e1393b50eaa82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/fa8cce7720fa782899a0aa97b6a41225d1bb7b26", - "reference": "fa8cce7720fa782899a0aa97b6a41225d1bb7b26", + "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/f94d246cc143ec5a23da868f8f7e1393b50eaa82", + "reference": "f94d246cc143ec5a23da868f8f7e1393b50eaa82", "shasum": "" }, "require": { "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.11" + "phpstan/phpstan": "^1.12" }, "require-dev": { "php-parallel-lint/php-parallel-lint": "^1.2", @@ -5073,27 +5370,27 @@ "description": "PHPStan rules for detecting usage of deprecated classes, methods, properties, constants and traits.", "support": { "issues": "https://github.com/phpstan/phpstan-deprecation-rules/issues", - "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/1.2.0" + "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/1.2.1" }, - "time": "2024-04-20T06:39:48+00:00" + "time": "2024-09-11T15:52:35+00:00" }, { "name": "phpstan/phpstan-phpunit", - "version": "1.4.0", + "version": "1.4.1", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-phpunit.git", - "reference": "f3ea021866f4263f07ca3636bf22c64be9610c11" + "reference": "11d4235fbc6313ecbf93708606edfd3222e44949" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/f3ea021866f4263f07ca3636bf22c64be9610c11", - "reference": "f3ea021866f4263f07ca3636bf22c64be9610c11", + "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/11d4235fbc6313ecbf93708606edfd3222e44949", + "reference": "11d4235fbc6313ecbf93708606edfd3222e44949", "shasum": "" }, "require": { "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.11" + "phpstan/phpstan": "^1.12" }, "conflict": { "phpunit/phpunit": "<7.0" @@ -5125,27 +5422,27 @@ "description": "PHPUnit extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-phpunit/issues", - "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.4.0" + "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.4.1" }, - "time": "2024-04-20T06:39:00+00:00" + "time": "2024-11-12T12:43:59+00:00" }, { "name": "phpstan/phpstan-strict-rules", - "version": "1.6.0", + "version": "1.6.1", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-strict-rules.git", - "reference": "363f921dd8441777d4fc137deb99beb486c77df1" + "reference": "daeec748b53de80a97498462513066834ec28f8b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/363f921dd8441777d4fc137deb99beb486c77df1", - "reference": "363f921dd8441777d4fc137deb99beb486c77df1", + "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/daeec748b53de80a97498462513066834ec28f8b", + "reference": "daeec748b53de80a97498462513066834ec28f8b", "shasum": "" }, "require": { "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.11" + "phpstan/phpstan": "^1.12.4" }, "require-dev": { "nikic/php-parser": "^4.13.0", @@ -5174,28 +5471,28 @@ "description": "Extra strict and opinionated rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-strict-rules/issues", - "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.6.0" + "source": "https://github.com/phpstan/phpstan-strict-rules/tree/1.6.1" }, - "time": "2024-04-20T06:37:51+00:00" + "time": "2024-09-20T14:04:44+00:00" }, { "name": "phpstan/phpstan-symfony", - "version": "1.4.6", + "version": "1.4.12", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-symfony.git", - "reference": "e909a075d69e0d4db262ac3407350ae2c6b6ab5f" + "reference": "c7b7e7f520893621558bfbfdb2694d4364565c1d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/e909a075d69e0d4db262ac3407350ae2c6b6ab5f", - "reference": "e909a075d69e0d4db262ac3407350ae2c6b6ab5f", + "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/c7b7e7f520893621558bfbfdb2694d4364565c1d", + "reference": "c7b7e7f520893621558bfbfdb2694d4364565c1d", "shasum": "" }, "require": { "ext-simplexml": "*", "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.11.7" + "phpstan/phpstan": "^1.12" }, "conflict": { "symfony/framework-bundle": "<3.0" @@ -5246,34 +5543,34 @@ "description": "Symfony Framework extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-symfony/issues", - "source": "https://github.com/phpstan/phpstan-symfony/tree/1.4.6" + "source": "https://github.com/phpstan/phpstan-symfony/tree/1.4.12" }, - "time": "2024-07-16T11:48:54+00:00" + "time": "2024-11-06T10:13:18+00:00" }, { "name": "phpstan/phpstan-webmozart-assert", - "version": "1.2.7", + "version": "1.2.11", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-webmozart-assert.git", - "reference": "923bd58cc1c8d2bf8e78a8fbca4b224805237dc2" + "reference": "960dd44e8466191590dd0d7940d3e9496eebebbd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-webmozart-assert/zipball/923bd58cc1c8d2bf8e78a8fbca4b224805237dc2", - "reference": "923bd58cc1c8d2bf8e78a8fbca4b224805237dc2", + "url": "https://api.github.com/repos/phpstan/phpstan-webmozart-assert/zipball/960dd44e8466191590dd0d7940d3e9496eebebbd", + "reference": "960dd44e8466191590dd0d7940d3e9496eebebbd", "shasum": "" }, "require": { "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.10" + "phpstan/phpstan": "^1.12" }, "require-dev": { "nikic/php-parser": "^4.13.0", "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/phpstan-deprecation-rules": "^1.1", - "phpstan/phpstan-phpunit": "^1.0", - "phpstan/phpstan-strict-rules": "^1.0", + "phpstan/phpstan-deprecation-rules": "^1.2", + "phpstan/phpstan-phpunit": "^1.4", + "phpstan/phpstan-strict-rules": "^1.6", "phpunit/phpunit": "^9.5", "webmozart/assert": "^1.11.0" }, @@ -5297,38 +5594,38 @@ "description": "PHPStan webmozart/assert extension", "support": { "issues": "https://github.com/phpstan/phpstan-webmozart-assert/issues", - "source": "https://github.com/phpstan/phpstan-webmozart-assert/tree/1.2.7" + "source": "https://github.com/phpstan/phpstan-webmozart-assert/tree/1.2.11" }, - "time": "2024-07-05T08:05:21+00:00" + "time": "2024-09-11T15:48:08+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "10.1.15", + "version": "10.1.16", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae" + "reference": "7e308268858ed6baedc8704a304727d20bc07c77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae", - "reference": "5da8b1728acd1e6ffdf2ff32ffbdfd04307f26ae", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7e308268858ed6baedc8704a304727d20bc07c77", + "reference": "7e308268858ed6baedc8704a304727d20bc07c77", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.18 || ^5.0", + "nikic/php-parser": "^4.19.1 || ^5.1.0", "php": ">=8.1", - "phpunit/php-file-iterator": "^4.0", - "phpunit/php-text-template": "^3.0", - "sebastian/code-unit-reverse-lookup": "^3.0", - "sebastian/complexity": "^3.0", - "sebastian/environment": "^6.0", - "sebastian/lines-of-code": "^2.0", - "sebastian/version": "^4.0", - "theseer/tokenizer": "^1.2.0" + "phpunit/php-file-iterator": "^4.1.0", + "phpunit/php-text-template": "^3.0.1", + "sebastian/code-unit-reverse-lookup": "^3.0.0", + "sebastian/complexity": "^3.2.0", + "sebastian/environment": "^6.1.0", + "sebastian/lines-of-code": "^2.0.2", + "sebastian/version": "^4.0.1", + "theseer/tokenizer": "^1.2.3" }, "require-dev": { "phpunit/phpunit": "^10.1" @@ -5340,7 +5637,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "10.1-dev" + "dev-main": "10.1.x-dev" } }, "autoload": { @@ -5369,7 +5666,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.15" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.16" }, "funding": [ { @@ -5377,7 +5674,7 @@ "type": "github" } ], - "time": "2024-06-29T08:25:15+00:00" + "time": "2024-08-22T04:31:57+00:00" }, { "name": "phpunit/php-file-iterator", @@ -5624,16 +5921,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.27", + "version": "10.5.38", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "2425f713b2a5350568ccb1a2d3984841a23e83c5" + "reference": "a86773b9e887a67bc53efa9da9ad6e3f2498c132" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/2425f713b2a5350568ccb1a2d3984841a23e83c5", - "reference": "2425f713b2a5350568ccb1a2d3984841a23e83c5", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a86773b9e887a67bc53efa9da9ad6e3f2498c132", + "reference": "a86773b9e887a67bc53efa9da9ad6e3f2498c132", "shasum": "" }, "require": { @@ -5647,14 +5944,14 @@ "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.1", - "phpunit/php-code-coverage": "^10.1.15", + "phpunit/php-code-coverage": "^10.1.16", "phpunit/php-file-iterator": "^4.1.0", "phpunit/php-invoker": "^4.0.0", "phpunit/php-text-template": "^3.0.1", "phpunit/php-timer": "^6.0.0", "sebastian/cli-parser": "^2.0.1", "sebastian/code-unit": "^2.0.0", - "sebastian/comparator": "^5.0.1", + "sebastian/comparator": "^5.0.3", "sebastian/diff": "^5.1.1", "sebastian/environment": "^6.1.0", "sebastian/exporter": "^5.1.2", @@ -5705,7 +6002,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.27" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.38" }, "funding": [ { @@ -5721,7 +6018,7 @@ "type": "tidelift" } ], - "time": "2024-07-10T11:48:06+00:00" + "time": "2024-10-28T13:06:21+00:00" }, { "name": "react/cache", @@ -6097,31 +6394,31 @@ }, { "name": "react/socket", - "version": "v1.15.0", + "version": "v1.16.0", "source": { "type": "git", "url": "https://github.com/reactphp/socket.git", - "reference": "216d3aec0b87f04a40ca04f481e6af01bdd1d038" + "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/socket/zipball/216d3aec0b87f04a40ca04f481e6af01bdd1d038", - "reference": "216d3aec0b87f04a40ca04f481e6af01bdd1d038", + "url": "https://api.github.com/repos/reactphp/socket/zipball/23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", + "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", "shasum": "" }, "require": { "evenement/evenement": "^3.0 || ^2.0 || ^1.0", "php": ">=5.3.0", - "react/dns": "^1.11", + "react/dns": "^1.13", "react/event-loop": "^1.2", - "react/promise": "^3 || ^2.6 || ^1.2.1", - "react/stream": "^1.2" + "react/promise": "^3.2 || ^2.6 || ^1.2.1", + "react/stream": "^1.4" }, "require-dev": { "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", - "react/async": "^4 || ^3 || ^2", + "react/async": "^4.3 || ^3.3 || ^2", "react/promise-stream": "^1.4", - "react/promise-timer": "^1.10" + "react/promise-timer": "^1.11" }, "type": "library", "autoload": { @@ -6165,7 +6462,7 @@ ], "support": { "issues": "https://github.com/reactphp/socket/issues", - "source": "https://github.com/reactphp/socket/tree/v1.15.0" + "source": "https://github.com/reactphp/socket/tree/v1.16.0" }, "funding": [ { @@ -6173,7 +6470,7 @@ "type": "open_collective" } ], - "time": "2023-12-15T11:02:10+00:00" + "time": "2024-07-26T10:38:09+00:00" }, { "name": "react/stream", @@ -6255,21 +6552,21 @@ }, { "name": "rector/rector", - "version": "1.2.1", + "version": "1.2.10", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "b38a3eed3ce2046f40c001255e2fec9d2746bacf" + "reference": "40f9cf38c05296bd32f444121336a521a293fa61" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/b38a3eed3ce2046f40c001255e2fec9d2746bacf", - "reference": "b38a3eed3ce2046f40c001255e2fec9d2746bacf", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/40f9cf38c05296bd32f444121336a521a293fa61", + "reference": "40f9cf38c05296bd32f444121336a521a293fa61", "shasum": "" }, "require": { "php": "^7.2|^8.0", - "phpstan/phpstan": "^1.11" + "phpstan/phpstan": "^1.12.5" }, "conflict": { "rector/rector-doctrine": "*", @@ -6302,7 +6599,7 @@ ], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/1.2.1" + "source": "https://github.com/rectorphp/rector/tree/1.2.10" }, "funding": [ { @@ -6310,7 +6607,7 @@ "type": "github" } ], - "time": "2024-07-16T00:22:54+00:00" + "time": "2024-11-08T13:59:10+00:00" }, { "name": "sebastian/cli-parser", @@ -6482,16 +6779,16 @@ }, { "name": "sebastian/comparator", - "version": "5.0.1", + "version": "5.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "2db5010a484d53ebf536087a70b4a5423c102372" + "reference": "a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2db5010a484d53ebf536087a70b4a5423c102372", - "reference": "2db5010a484d53ebf536087a70b4a5423c102372", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e", + "reference": "a18251eb0b7a2dcd2f7aa3d6078b18545ef0558e", "shasum": "" }, "require": { @@ -6502,7 +6799,7 @@ "sebastian/exporter": "^5.0" }, "require-dev": { - "phpunit/phpunit": "^10.3" + "phpunit/phpunit": "^10.5" }, "type": "library", "extra": { @@ -6547,7 +6844,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.1" + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.3" }, "funding": [ { @@ -6555,7 +6852,7 @@ "type": "github" } ], - "time": "2023-08-14T13:18:12+00:00" + "time": "2024-10-18T14:56:07+00:00" }, { "name": "sebastian/complexity", @@ -7403,16 +7700,16 @@ }, { "name": "symfony/mime", - "version": "v6.4.9", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "7d048964877324debdcb4e0549becfa064a20d43" + "reference": "1de1cf14d99b12c7ebbb850491ec6ae3ed468855" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/7d048964877324debdcb4e0549becfa064a20d43", - "reference": "7d048964877324debdcb4e0549becfa064a20d43", + "url": "https://api.github.com/repos/symfony/mime/zipball/1de1cf14d99b12c7ebbb850491ec6ae3ed468855", + "reference": "1de1cf14d99b12c7ebbb850491ec6ae3ed468855", "shasum": "" }, "require": { @@ -7468,7 +7765,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v6.4.9" + "source": "https://github.com/symfony/mime/tree/v6.4.13" }, "funding": [ { @@ -7484,20 +7781,20 @@ "type": "tidelift" } ], - "time": "2024-06-28T09:49:33+00:00" + "time": "2024-10-25T15:07:50+00:00" }, { "name": "symfony/options-resolver", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "22ab9e9101ab18de37839074f8a1197f55590c1b" + "reference": "0a62a9f2504a8dd27083f89d21894ceb01cc59db" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/22ab9e9101ab18de37839074f8a1197f55590c1b", - "reference": "22ab9e9101ab18de37839074f8a1197f55590c1b", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/0a62a9f2504a8dd27083f89d21894ceb01cc59db", + "reference": "0a62a9f2504a8dd27083f89d21894ceb01cc59db", "shasum": "" }, "require": { @@ -7535,7 +7832,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v6.4.8" + "source": "https://github.com/symfony/options-resolver/tree/v6.4.13" }, "funding": [ { @@ -7551,26 +7848,25 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c" + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", - "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", "shasum": "" }, "require": { - "php": ">=7.1", - "symfony/polyfill-intl-normalizer": "^1.10", - "symfony/polyfill-php72": "^1.10" + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" }, "suggest": { "ext-intl": "For best performance" @@ -7619,7 +7915,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0" }, "funding": [ { @@ -7635,97 +7931,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" - }, - { - "name": "symfony/polyfill-php72", - "version": "v1.30.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "10112722600777e02d2745716b70c5db4ca70442" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/10112722600777e02d2745716b70c5db4ca70442", - "reference": "10112722600777e02d2745716b70c5db4ca70442", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php72\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php72/tree/v1.30.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-06-19T12:30:46+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.30.0", + "version": "v1.31.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "ec444d3f3f6505bb28d11afa41e75faadebc10a1" + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/ec444d3f3f6505bb28d11afa41e75faadebc10a1", - "reference": "ec444d3f3f6505bb28d11afa41e75faadebc10a1", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { @@ -7768,7 +7991,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.31.0" }, "funding": [ { @@ -7784,24 +8007,24 @@ "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "symfony/polyfill-php81", - "version": "v1.30.0", + "name": "symfony/polyfill-php80", + "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php81.git", - "reference": "3fb075789fb91f9ad9af537c4012d523085bd5af" + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/3fb075789fb91f9ad9af537c4012d523085bd5af", - "reference": "3fb075789fb91f9ad9af537c4012d523085bd5af", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "type": "library", "extra": { @@ -7815,7 +8038,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php81\\": "" + "Symfony\\Polyfill\\Php80\\": "" }, "classmap": [ "Resources/stubs" @@ -7826,6 +8049,10 @@ "MIT" ], "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, { "name": "Nicolas Grekas", "email": "p@tchwork.com" @@ -7835,7 +8062,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -7844,7 +8071,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php81/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" }, "funding": [ { @@ -7860,20 +8087,20 @@ "type": "tidelift" } ], - "time": "2024-06-19T12:30:46+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { "name": "symfony/stopwatch", - "version": "v6.4.8", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "63e069eb616049632cde9674c46957819454b8aa" + "reference": "2cae0a6f8d04937d02f6d19806251e2104d54f92" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/63e069eb616049632cde9674c46957819454b8aa", - "reference": "63e069eb616049632cde9674c46957819454b8aa", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/2cae0a6f8d04937d02f6d19806251e2104d54f92", + "reference": "2cae0a6f8d04937d02f6d19806251e2104d54f92", "shasum": "" }, "require": { @@ -7906,7 +8133,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v6.4.8" + "source": "https://github.com/symfony/stopwatch/tree/v6.4.13" }, "funding": [ { @@ -7922,7 +8149,7 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "theseer/tokenizer", @@ -7977,17 +8204,17 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": {}, "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", "ext-filter": "*", "ext-json": "*", "ext-mbstring": "*", "composer-plugin-api": "^2.1", "composer-runtime-api": "^2.1" }, - "platform-dev": [], + "platform-dev": {}, "plugin-api-version": "2.6.0" } diff --git a/docs/conf.py b/docs/conf.py index 5ada4c0d..e7a7d5c6 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -9,7 +9,7 @@ project = "Project Builder" copyright = "since 2022 by coding. powerful. systems. CPS GmbH" author = "Elias Häußler, Martin Adler" -release = "2.10.0" +release = "2.13.0" # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration diff --git a/docs/development/configuration.md b/docs/development/configuration.md index 4ec0f3bb..d3377270 100644 --- a/docs/development/configuration.md +++ b/docs/development/configuration.md @@ -212,6 +212,11 @@ steps: command: 'git init --initial-branch=main' skipConfirmation: true allowFailure: true + - type: runCommand + options: + command: 'composer update' + allowFailure: true + required: false - type: showNextSteps options: templateFile: templates/next-steps.html.twig diff --git a/docs/index.md b/docs/index.md index 11435740..0a2e21ee 100644 --- a/docs/index.md +++ b/docs/index.md @@ -6,10 +6,10 @@ og:description: A Composer package for creating new projects based on various sp # Project Builder -[![Latest Stable Version](http://poser.pugx.org/cpsit/project-builder/v)][1] -[![Total Downloads](http://poser.pugx.org/cpsit/project-builder/downloads)][2] -[![Docker](https://img.shields.io/docker/v/cpsit/project-builder?label=docker&sort=semver)][3] -[![License](http://poser.pugx.org/cpsit/project-builder/license)](contributing/license.md) +[![Latest Stable Version](https://img.shields.io/packagist/v/cpsit/project-builder?label=version)][1] +[![Packagist Downloads](https://img.shields.io/packagist/dt/cpsit/project-builder?label=packagist+downloads&color=brightgreen)][2] +[![GHCR Pulls](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fipitio.github.io%2Fbackage%2FCPS-IT%2Fproject-builder%2Fproject-builder.json&query=%24.downloads&label=GHCR%20pulls&color=brightgreen)][3] +[![Docker Pulls](https://img.shields.io/docker/pulls/cpsit/project-builder?label=docker+pulls&color=brightgreen)][4] A Composer package to **create new projects** based on various, specific **project templates**. All project templates are distributed as separate Composer packages. @@ -63,6 +63,7 @@ contributing/workflow contributing/license ``` -[1]: https://packagist.org/packages/cpsit/project-builder -[2]: https://packagist.org/packages/cpsit/project-builder/stats -[3]: https://hub.docker.com/r/cpsit/project-builder +[1]: https://github.com/CPS-IT/project-builder/releases/latest +[2]: https://packagist.org/packages/cpsit/project-builder +[3]: https://github.com/CPS-IT/project-builder/pkgs/container/project-builder +[4]: https://hub.docker.com/r/cpsit/project-builder diff --git a/installer/composer.json.twig b/installer/composer.json.twig index 0ebd3bf3..ee41eae1 100644 --- a/installer/composer.json.twig +++ b/installer/composer.json.twig @@ -3,7 +3,7 @@ "description": "Template installer for cpsit/project-builder", "license": "GPL-3.0-or-later", "require": { - "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", "composer/installers": "^2.0", "oomphinc/composer-installers-extender": "^2.0", {% for templateSource in templateSources %} diff --git a/resources/config.schema.json b/resources/config.schema.json index ab966702..dd91eac5 100644 --- a/resources/config.schema.json +++ b/resources/config.schema.json @@ -315,6 +315,12 @@ "title": "Allow command execution failure", "description": "Ignore errors occurred during command execution and continue as normal", "default": false + }, + "required": { + "type": "boolean", + "title": "Enforce command execution", + "description": "If set to true, the command must be executed and cannot be skipped, otherwise project generation fails", + "default": true } }, "required": [ diff --git a/src/Builder/Config/ValueObject/StepOptions.php b/src/Builder/Config/ValueObject/StepOptions.php index 6a52f039..bc1fdcb5 100644 --- a/src/Builder/Config/ValueObject/StepOptions.php +++ b/src/Builder/Config/ValueObject/StepOptions.php @@ -41,6 +41,7 @@ public function __construct( private readonly ?string $command = null, private readonly bool $skipConfirmation = false, private readonly bool $allowFailure = false, + private readonly bool $required = true, ) {} /** @@ -75,4 +76,9 @@ public function shouldAllowFailure(): bool { return $this->allowFailure; } + + public function isRequired(): bool + { + return $this->required; + } } diff --git a/src/Builder/Generator/Step/RunCommandStep.php b/src/Builder/Generator/Step/RunCommandStep.php index 5465f2f3..308da5bf 100644 --- a/src/Builder/Generator/Step/RunCommandStep.php +++ b/src/Builder/Generator/Step/RunCommandStep.php @@ -57,7 +57,7 @@ public function run(BuildResult $buildResult): bool if (!$this->config->getOptions()->shouldSkipConfirmation() && !$this->messenger->confirmRunCommand($command)) { $this->stopped = true; - return false; + return !$this->config->getOptions()->isRequired(); } $this->messenger->newLine(ComposerIO\IOInterface::VERBOSE); diff --git a/tests/bootstrap.php b/tests/bootstrap.php index c1d836af..eb11abca 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -21,7 +21,9 @@ * along with this program. If not, see . */ +use CPSIT\ProjectBuilder\DependencyInjection; + require_once dirname(__DIR__).'/.build/vendor/autoload.php'; -$factory = CPSIT\ProjectBuilder\DependencyInjection\ContainerFactory::createForTesting(); +$factory = DependencyInjection\ContainerFactory::createForTesting(); $factory->get(); diff --git a/tests/src/Builder/Artifact/Migration/Migration1688738958Test.php b/tests/src/Builder/Artifact/Migration/Migration1688738958Test.php index 3c889837..a4d8de2a 100644 --- a/tests/src/Builder/Artifact/Migration/Migration1688738958Test.php +++ b/tests/src/Builder/Artifact/Migration/Migration1688738958Test.php @@ -44,7 +44,9 @@ final class Migration1688738958Test extends Tests\ContainerAwareTestCase protected function setUp(): void { - $this->subject = self::$container->get(Src\Builder\Artifact\Migration\Migration1688738958::class); + parent::setUp(); + + $this->subject = $this->container->get(Src\Builder\Artifact\Migration\Migration1688738958::class); $this->artifact = [ 'template' => [ 'provider' => [ diff --git a/tests/src/Builder/ArtifactGeneratorTest.php b/tests/src/Builder/ArtifactGeneratorTest.php index 7a504b3d..f892963c 100644 --- a/tests/src/Builder/ArtifactGeneratorTest.php +++ b/tests/src/Builder/ArtifactGeneratorTest.php @@ -46,14 +46,16 @@ final class ArtifactGeneratorTest extends Tests\ContainerAwareTestCase protected function setUp(): void { - $this->subject = self::$container->get(Src\Builder\ArtifactGenerator::class); + parent::setUp(); + + $this->subject = $this->container->get(Src\Builder\ArtifactGenerator::class); $this->artifactFile = Src\Helper\FilesystemHelper::createFileObject( Src\Helper\FilesystemHelper::getNewTemporaryDirectory(), 'build-artifact.json', ); $this->buildResult = new Src\Builder\BuildResult( new Src\Builder\BuildInstructions( - self::$container->get('app.config'), + $this->container->get('app.config'), 'foo', ), ); diff --git a/tests/src/Builder/ArtifactReaderTest.php b/tests/src/Builder/ArtifactReaderTest.php index 3431f366..25757082 100644 --- a/tests/src/Builder/ArtifactReaderTest.php +++ b/tests/src/Builder/ArtifactReaderTest.php @@ -43,9 +43,11 @@ final class ArtifactReaderTest extends Tests\ContainerAwareTestCase protected function setUp(): void { + parent::setUp(); + $this->artifactFile = dirname(__DIR__).'/Fixtures/Files/build-artifact.json'; - $this->migration = self::$container->get(Tests\Fixtures\DummyMigration::class); - $this->subject = self::$container->get(Src\Builder\ArtifactReader::class); + $this->migration = $this->container->get(Tests\Fixtures\DummyMigration::class); + $this->subject = $this->container->get(Src\Builder\ArtifactReader::class); } #[Framework\Attributes\Test] diff --git a/tests/src/Builder/BuildInstructionsTest.php b/tests/src/Builder/BuildInstructionsTest.php index 35b8dc19..5e281af7 100644 --- a/tests/src/Builder/BuildInstructionsTest.php +++ b/tests/src/Builder/BuildInstructionsTest.php @@ -42,8 +42,10 @@ final class BuildInstructionsTest extends Tests\ContainerAwareTestCase protected function setUp(): void { + parent::setUp(); + $this->subject = new Src\Builder\BuildInstructions( - self::$container->get('app.config'), + $this->container->get('app.config'), 'foo', ); } @@ -51,7 +53,7 @@ protected function setUp(): void #[Framework\Attributes\Test] public function getConfigReturnsConfig(): void { - self::assertSame(self::$container->get('app.config'), $this->subject->getConfig()); + self::assertSame($this->container->get('app.config'), $this->subject->getConfig()); } #[Framework\Attributes\Test] diff --git a/tests/src/Builder/BuildResultTest.php b/tests/src/Builder/BuildResultTest.php index 5296840c..a4072016 100644 --- a/tests/src/Builder/BuildResultTest.php +++ b/tests/src/Builder/BuildResultTest.php @@ -44,8 +44,10 @@ final class BuildResultTest extends Tests\ContainerAwareTestCase protected function setUp(): void { + parent::setUp(); + $this->instructions = new Src\Builder\BuildInstructions( - self::$container->get('app.config'), + $this->container->get('app.config'), 'foo', ); $this->subject = new Src\Builder\BuildResult( @@ -101,7 +103,7 @@ public function isStepAppliedTestsWhetherStepIsApplied(): void self::assertFalse($this->subject->isStepApplied('foo')); self::assertFalse($this->subject->isStepApplied( - self::$container->get(Src\Builder\Generator\Step\InstallComposerDependenciesStep::class), + $this->container->get(Src\Builder\Generator\Step\InstallComposerDependenciesStep::class), )); } diff --git a/tests/src/Builder/Generator/GeneratorTest.php b/tests/src/Builder/Generator/GeneratorTest.php index 2cf59188..5e7b9ebd 100644 --- a/tests/src/Builder/Generator/GeneratorTest.php +++ b/tests/src/Builder/Generator/GeneratorTest.php @@ -49,17 +49,19 @@ final class GeneratorTest extends Tests\ContainerAwareTestCase protected function setUp(): void { - $this->subject = self::$container->get(Src\Builder\Generator\Generator::class); - $this->eventDispatcher = self::$container->get(EventDispatcher\EventDispatcherInterface::class); - $this->eventListener = self::$container->get(Tests\Fixtures\DummyEventListener::class); - $this->filesystem = self::$container->get(Filesystem\Filesystem::class); + parent::setUp(); + + $this->subject = $this->container->get(Src\Builder\Generator\Generator::class); + $this->eventDispatcher = $this->container->get(EventDispatcher\EventDispatcherInterface::class); + $this->eventListener = $this->container->get(Tests\Fixtures\DummyEventListener::class); + $this->filesystem = $this->container->get(Filesystem\Filesystem::class); $this->targetDirectory = Src\Helper\FilesystemHelper::getNewTemporaryDirectory(); } #[Framework\Attributes\Test] public function runRunsThroughAllConfiguredSteps(): void { - self::$io->setUserInputs(['foo']); + $this->io->setUserInputs(['foo']); self::assertCount(0, $this->eventListener->dispatchedEvents); @@ -73,7 +75,7 @@ public function runRunsThroughAllConfiguredSteps(): void self::assertTrue($actual->isStepApplied('runCommand')); self::assertTrue($actual->isMirrored()); - $output = self::$io->getOutput(); + $output = $this->io->getOutput(); self::assertStringContainsString('Running step #1 "collectBuildInstructions"...', $output); self::assertStringContainsString('Running step #2 "processSourceFiles"...', $output); @@ -100,7 +102,7 @@ public function runRunsThroughAllConfiguredSteps(): void #[Framework\Attributes\Test] public function runRestartsProjectGenerationOnStepFailure(): void { - self::$io->setUserInputs(['', '', '', 'yes', 'foo']); + $this->io->setUserInputs(['', '', '', 'yes', 'foo']); self::assertCount(0, $this->eventListener->dispatchedEvents); @@ -113,7 +115,7 @@ public function runRestartsProjectGenerationOnStepFailure(): void self::assertTrue($actual->isStepApplied('mirrorProcessedFiles')); self::assertTrue($actual->isMirrored()); - $output = self::$io->getOutput(); + $output = $this->io->getOutput(); self::assertStringContainsString('If you want, you can restart project generation now.', $output); self::assertFileExists($this->targetDirectory.'/dummy.yaml'); @@ -148,7 +150,7 @@ public function runRevertsAppliedStepsOnStepFailure(): void // Register custom listener that lets the GenerateBuildArtifactStep fail $this->eventDispatcher->addListener(Src\Event\ProjectBuildStartedEvent::class, $listener); - self::$io->setUserInputs(['', '', 'foo', 'no']); + $this->io->setUserInputs(['', '', 'foo', 'no']); $this->subject->run($this->targetDirectory); @@ -210,12 +212,12 @@ public function runRevertsAppliedStepsAndExistsIfStoppableStepFailed(): void $subject = new Src\Builder\Generator\Generator( $config, - self::$container->get('app.messenger'), + $this->container->get('app.messenger'), $stepFactory, $this->filesystem, - self::$container->get(EventDispatcher\EventDispatcherInterface::class), - self::$container->get(Src\Builder\Writer\JsonFileWriter::class), - self::$container->get(Src\Builder\ArtifactGenerator::class), + $this->container->get(EventDispatcher\EventDispatcherInterface::class), + $this->container->get(Src\Builder\Writer\JsonFileWriter::class), + $this->container->get(Src\Builder\ArtifactGenerator::class), ); $actual = $subject->run($this->targetDirectory); @@ -227,15 +229,15 @@ public function runRevertsAppliedStepsAndExistsIfStoppableStepFailed(): void #[Framework\Attributes\Test] public function runDisplaysExceptionMessageOnVerboseOutput(): void { - self::$io->setVerbosity(Console\Output\OutputInterface::VERBOSITY_VERBOSE); - self::$io->setUserInputs(['', '', '', 'no']); + $this->io->setVerbosity(Console\Output\OutputInterface::VERBOSITY_VERBOSE); + $this->io->setUserInputs(['', '', '', 'no']); try { $this->subject->run($this->targetDirectory); } catch (Src\Exception\StepFailureException) { } - $output = self::$io->getOutput(); + $output = $this->io->getOutput(); self::assertStringContainsString( 'Exception: The given input must not be empty.', @@ -247,8 +249,8 @@ public function runDisplaysExceptionMessageOnVerboseOutput(): void #[Framework\Attributes\Test] public function runDisplaysExceptionTraceOnVeryVerboseOutput(): void { - self::$io->setVerbosity(Console\Output\OutputInterface::VERBOSITY_VERY_VERBOSE); - self::$io->setUserInputs(['', '', '', 'no']); + $this->io->setVerbosity(Console\Output\OutputInterface::VERBOSITY_VERY_VERBOSE); + $this->io->setUserInputs(['', '', '', 'no']); try { $this->subject->run($this->targetDirectory); @@ -257,14 +259,14 @@ public function runDisplaysExceptionTraceOnVeryVerboseOutput(): void self::assertStringContainsString( 'Exception: The given input must not be empty.'.PHP_EOL.'#0', - self::$io->getOutput(), + $this->io->getOutput(), ); } #[Framework\Attributes\Test] public function dumpArtifactDumpsBuildArtifact(): void { - self::$io->setUserInputs(['foo']); + $this->io->setUserInputs(['foo']); $result = $this->subject->run($this->targetDirectory); @@ -276,7 +278,7 @@ public function dumpArtifactDumpsBuildArtifact(): void #[Framework\Attributes\Test] public function cleanUpCleansUpRemainingFilesInTargetDirectory(): void { - self::$io->setUserInputs(['foo']); + $this->io->setUserInputs(['foo']); $result = $this->subject->run($this->targetDirectory); @@ -285,7 +287,7 @@ public function cleanUpCleansUpRemainingFilesInTargetDirectory(): void self::assertTrue($result->isStepApplied('cleanUp')); } - protected static function createConfig(): Src\Builder\Config\Config + protected function createConfig(): Src\Builder\Config\Config { $configReader = Src\Builder\Config\ConfigFactory::create(); @@ -305,8 +307,6 @@ protected static function createConfig(): Src\Builder\Config\Config protected function tearDown(): void { - parent::tearDown(); - $this->eventListener->dispatchedEvents = []; if ($this->filesystem->exists($this->targetDirectory)) { diff --git a/tests/src/Builder/Generator/Step/CleanUpStepTest.php b/tests/src/Builder/Generator/Step/CleanUpStepTest.php index ce19b0e2..99768cc7 100644 --- a/tests/src/Builder/Generator/Step/CleanUpStepTest.php +++ b/tests/src/Builder/Generator/Step/CleanUpStepTest.php @@ -43,11 +43,13 @@ final class CleanUpStepTest extends Tests\ContainerAwareTestCase protected function setUp(): void { + parent::setUp(); + $this->filesystem = new Filesystem\Filesystem(); $this->subject = new Src\Builder\Generator\Step\CleanUpStep($this->filesystem); $this->result = new Src\Builder\BuildResult( new Src\Builder\BuildInstructions( - self::$config, + $this->config, Src\Helper\FilesystemHelper::getNewTemporaryDirectory(), ), ); diff --git a/tests/src/Builder/Generator/Step/CollectBuildInstructionsStepTest.php b/tests/src/Builder/Generator/Step/CollectBuildInstructionsStepTest.php index 22f328e3..6c7c5062 100644 --- a/tests/src/Builder/Generator/Step/CollectBuildInstructionsStepTest.php +++ b/tests/src/Builder/Generator/Step/CollectBuildInstructionsStepTest.php @@ -40,8 +40,10 @@ final class CollectBuildInstructionsStepTest extends Tests\ContainerAwareTestCas protected function setUp(): void { - $this->subject = self::$container->get(Src\Builder\Generator\Step\CollectBuildInstructionsStep::class); - $this->eventListener = self::$container->get(Tests\Fixtures\DummyEventListener::class); + parent::setUp(); + + $this->subject = $this->container->get(Src\Builder\Generator\Step\CollectBuildInstructionsStep::class); + $this->eventListener = $this->container->get(Tests\Fixtures\DummyEventListener::class); } #[Framework\Attributes\Test] @@ -183,8 +185,6 @@ public function runRendersPropertyValueAsTwigTemplate(): void protected function tearDown(): void { - parent::tearDown(); - $this->eventListener->dispatchedEvents = []; } } diff --git a/tests/src/Builder/Generator/Step/DumpBuildArtifactStepTest.php b/tests/src/Builder/Generator/Step/DumpBuildArtifactStepTest.php index b11bdc8f..46d680a7 100644 --- a/tests/src/Builder/Generator/Step/DumpBuildArtifactStepTest.php +++ b/tests/src/Builder/Generator/Step/DumpBuildArtifactStepTest.php @@ -50,15 +50,17 @@ final class DumpBuildArtifactStepTest extends Tests\ContainerAwareTestCase protected function setUp(): void { - $this->filesystem = self::$container->get(Filesystem\Filesystem::class); - $this->artifactGenerator = self::$container->get(Src\Builder\ArtifactGenerator::class); + parent::setUp(); + + $this->filesystem = $this->container->get(Filesystem\Filesystem::class); + $this->artifactGenerator = $this->container->get(Src\Builder\ArtifactGenerator::class); $this->subject = new Src\Builder\Generator\Step\DumpBuildArtifactStep( $this->filesystem, - self::$container->get(Src\Builder\Writer\JsonFileWriter::class), + $this->container->get(Src\Builder\Writer\JsonFileWriter::class), $this->artifactGenerator, ); $this->buildResult = new Src\Builder\BuildResult( - new Src\Builder\BuildInstructions(self::$config, 'foo'), + new Src\Builder\BuildInstructions($this->config, 'foo'), ); $this->artifactFile = Src\Helper\FilesystemHelper::createFileObject( $this->buildResult->getWrittenDirectory(), @@ -134,8 +136,6 @@ public function supportsReturnsFalse(): void protected function tearDown(): void { - parent::tearDown(); - $this->filesystem->remove($this->artifactFile->getPathname()); } } diff --git a/tests/src/Builder/Generator/Step/GenerateBuildArtifactStepTest.php b/tests/src/Builder/Generator/Step/GenerateBuildArtifactStepTest.php index a6fde721..30ae82a5 100644 --- a/tests/src/Builder/Generator/Step/GenerateBuildArtifactStepTest.php +++ b/tests/src/Builder/Generator/Step/GenerateBuildArtifactStepTest.php @@ -45,10 +45,12 @@ final class GenerateBuildArtifactStepTest extends Tests\ContainerAwareTestCase protected function setUp(): void { - $this->subject = self::$container->get(Src\Builder\Generator\Step\GenerateBuildArtifactStep::class); - $this->filesystem = self::$container->get(Filesystem\Filesystem::class); + parent::setUp(); + + $this->subject = $this->container->get(Src\Builder\Generator\Step\GenerateBuildArtifactStep::class); + $this->filesystem = $this->container->get(Filesystem\Filesystem::class); $this->buildResult = new Src\Builder\BuildResult( - new Src\Builder\BuildInstructions(self::$config, Src\Helper\FilesystemHelper::getNewTemporaryDirectory()), + new Src\Builder\BuildInstructions($this->config, Src\Helper\FilesystemHelper::getNewTemporaryDirectory()), ); $this->artifactFile = Src\Helper\FilesystemHelper::createFileObject( $this->buildResult->getInstructions()->getTargetDirectory(), @@ -60,7 +62,7 @@ protected function setUp(): void #[Framework\Attributes\DataProvider('runAsksForConfirmationIfArtifactPathAlreadyExistsDataProvider')] public function runAsksForConfirmationIfArtifactPathAlreadyExists(bool $continue, bool $expected): void { - self::$io->setUserInputs([$continue ? 'yes' : 'no']); + $this->io->setUserInputs([$continue ? 'yes' : 'no']); $this->filesystem->dumpFile($this->artifactFile->getPathname(), 'test'); @@ -71,7 +73,7 @@ public function runAsksForConfirmationIfArtifactPathAlreadyExists(bool $continue self::assertNull($this->buildResult->getArtifactFile()); self::assertStringContainsString( 'The build artifact cannot be generated because the resulting file already exists.', - self::$io->getOutput(), + $this->io->getOutput(), ); } @@ -94,8 +96,6 @@ public static function runAsksForConfirmationIfArtifactPathAlreadyExistsDataProv protected function tearDown(): void { - parent::tearDown(); - $this->filesystem->remove($this->artifactFile->getPathname()); } } diff --git a/tests/src/Builder/Generator/Step/InstallComposerDependenciesStepTest.php b/tests/src/Builder/Generator/Step/InstallComposerDependenciesStepTest.php index ccd50f7e..56770858 100644 --- a/tests/src/Builder/Generator/Step/InstallComposerDependenciesStepTest.php +++ b/tests/src/Builder/Generator/Step/InstallComposerDependenciesStepTest.php @@ -39,17 +39,19 @@ */ final class InstallComposerDependenciesStepTest extends Tests\ContainerAwareTestCase { - private static Filesystem\Filesystem $filesystem; - private static string $temporaryDirectory; + private Filesystem\Filesystem $filesystem; + private string $temporaryDirectory; private Src\Builder\Generator\Step\InstallComposerDependenciesStep $subject; private Src\Builder\BuildResult $buildResult; protected function setUp(): void { - $this->subject = self::$container->get(Src\Builder\Generator\Step\InstallComposerDependenciesStep::class); + parent::setUp(); + + $this->subject = $this->container->get(Src\Builder\Generator\Step\InstallComposerDependenciesStep::class); $this->buildResult = new Src\Builder\BuildResult( - new Src\Builder\BuildInstructions(self::$config, 'foo'), + new Src\Builder\BuildInstructions($this->config, 'foo'), ); } @@ -63,23 +65,23 @@ public function runInstallsComposerDependencies(): void #[Framework\Attributes\Test] public function runWritesComposerInstallOutputAndFailsOnFailure(): void { - $newConfig = self::createConfig(); + $newConfig = $this->createConfig(); - self::$config->setDeclaringFile($newConfig->getDeclaringFile()); - self::$filesystem->copy( + $this->config->setDeclaringFile($newConfig->getDeclaringFile()); + $this->filesystem->copy( dirname(__DIR__, 3).'/Fixtures/Files/invalid-composer.json', - self::$temporaryDirectory.'/composer.json', + $this->temporaryDirectory.'/composer.json', true, ); self::assertFalse($this->subject->run($this->buildResult)); self::assertStringContainsString( 'Your requirements could not be resolved to an installable set of packages.', - self::$io->getOutput(), + $this->io->getOutput(), ); } - protected static function createConfig(): Src\Builder\Config\Config + protected function createConfig(): Src\Builder\Config\Config { $templateDirectory = dirname(__DIR__, 3).'/Fixtures/Templates/yaml-template'; $finder = Finder\Finder::create() @@ -88,21 +90,19 @@ protected static function createConfig(): Src\Builder\Config\Config ->notName('composer.lock') ; - self::$temporaryDirectory = Src\Helper\FilesystemHelper::getNewTemporaryDirectory(); - self::$filesystem = new Filesystem\Filesystem(); - self::$filesystem->mirror($templateDirectory, self::$temporaryDirectory, $finder); + $this->temporaryDirectory = Src\Helper\FilesystemHelper::getNewTemporaryDirectory(); + $this->filesystem = new Filesystem\Filesystem(); + $this->filesystem->mirror($templateDirectory, $this->temporaryDirectory, $finder); $configFactory = Src\Builder\Config\ConfigFactory::create(); - return $configFactory->buildFromFile(self::$temporaryDirectory.'/config.yaml', 'yaml'); + return $configFactory->buildFromFile($this->temporaryDirectory.'/config.yaml', 'yaml'); } protected function tearDown(): void { - parent::tearDown(); - - if (self::$filesystem->exists(self::$temporaryDirectory)) { - self::$filesystem->remove(self::$temporaryDirectory); + if ($this->filesystem->exists($this->temporaryDirectory)) { + $this->filesystem->remove($this->temporaryDirectory); } } } diff --git a/tests/src/Builder/Generator/Step/Interaction/InteractionFactoryTest.php b/tests/src/Builder/Generator/Step/Interaction/InteractionFactoryTest.php index 9a43e6cc..390c41dd 100644 --- a/tests/src/Builder/Generator/Step/Interaction/InteractionFactoryTest.php +++ b/tests/src/Builder/Generator/Step/Interaction/InteractionFactoryTest.php @@ -39,7 +39,9 @@ final class InteractionFactoryTest extends Tests\ContainerAwareTestCase protected function setUp(): void { - $this->subject = self::$container->get(Src\Builder\Generator\Step\Interaction\InteractionFactory::class); + parent::setUp(); + + $this->subject = $this->container->get(Src\Builder\Generator\Step\Interaction\InteractionFactory::class); } #[Framework\Attributes\Test] diff --git a/tests/src/Builder/Generator/Step/Interaction/QuestionInteractionTest.php b/tests/src/Builder/Generator/Step/Interaction/QuestionInteractionTest.php index 2d069761..5e53aa94 100644 --- a/tests/src/Builder/Generator/Step/Interaction/QuestionInteractionTest.php +++ b/tests/src/Builder/Generator/Step/Interaction/QuestionInteractionTest.php @@ -40,8 +40,10 @@ final class QuestionInteractionTest extends Tests\ContainerAwareTestCase protected function setUp(): void { - $this->subject = self::$container->get(Src\Builder\Generator\Step\Interaction\QuestionInteraction::class); - $this->instructions = new Src\Builder\BuildInstructions(self::$config, 'foo'); + parent::setUp(); + + $this->subject = $this->container->get(Src\Builder\Generator\Step\Interaction\QuestionInteraction::class); + $this->instructions = new Src\Builder\BuildInstructions($this->config, 'foo'); } #[Framework\Attributes\Test] @@ -49,7 +51,7 @@ public function interactUsesTruAndFalseAsDefaultYesNoValues(): void { $interactionSubject = $this->buildInteractionSubject(); - self::$io->setUserInputs(['yes', 'no']); + $this->io->setUserInputs(['yes', 'no']); self::assertTrue($this->subject->interact($interactionSubject, $this->instructions)); self::assertFalse($this->subject->interact($interactionSubject, $this->instructions)); @@ -63,7 +65,7 @@ public function interactReturnsValueFromMatchingOption(): void new Src\Builder\Config\ValueObject\PropertyOption('bar', 'not selected'), ]); - self::$io->setUserInputs(['yes', 'no']); + $this->io->setUserInputs(['yes', 'no']); self::assertSame('foo', $this->subject->interact($interactionSubject, $this->instructions)); self::assertSame('bar', $this->subject->interact($interactionSubject, $this->instructions)); @@ -76,7 +78,7 @@ public function interactUsesFallbackConditionIfOnlyOptionValueIsConfigured(): vo new Src\Builder\Config\ValueObject\PropertyOption('foo'), ]); - self::$io->setUserInputs(['yes', 'no']); + $this->io->setUserInputs(['yes', 'no']); self::assertSame('foo', $this->subject->interact($interactionSubject, $this->instructions)); self::assertFalse($this->subject->interact($interactionSubject, $this->instructions)); diff --git a/tests/src/Builder/Generator/Step/Interaction/SelectInteractionTest.php b/tests/src/Builder/Generator/Step/Interaction/SelectInteractionTest.php index 17182fff..866e97b8 100644 --- a/tests/src/Builder/Generator/Step/Interaction/SelectInteractionTest.php +++ b/tests/src/Builder/Generator/Step/Interaction/SelectInteractionTest.php @@ -40,8 +40,10 @@ final class SelectInteractionTest extends Tests\ContainerAwareTestCase protected function setUp(): void { - $this->subject = self::$container->get(Src\Builder\Generator\Step\Interaction\SelectInteraction::class); - $this->instructions = new Src\Builder\BuildInstructions(self::$config, 'foo'); + parent::setUp(); + + $this->subject = $this->container->get(Src\Builder\Generator\Step\Interaction\SelectInteraction::class); + $this->instructions = new Src\Builder\BuildInstructions($this->config, 'foo'); } #[Framework\Attributes\Test] @@ -85,7 +87,7 @@ public function interactReturnsSelectedOption(): void ]; $interactionSubject = $this->buildInteractionSubject($propertyOptions, false, null, true); - self::$io->setUserInputs(['bar']); + $this->io->setUserInputs(['bar']); self::assertSame('bar', $this->subject->interact($interactionSubject, $this->instructions)); } @@ -101,7 +103,7 @@ public function interactReturnsSelectedOptionsIfMultipleOptionsAreAllowed(): voi ]; $interactionSubject = $this->buildInteractionSubject($propertyOptions, true); - self::$io->setUserInputs(['hello,bar']); + $this->io->setUserInputs(['hello,bar']); self::assertSame(['bar', 'hello'], $this->subject->interact($interactionSubject, $this->instructions)); } diff --git a/tests/src/Builder/Generator/Step/ProcessSharedSourceFilesStepTest.php b/tests/src/Builder/Generator/Step/ProcessSharedSourceFilesStepTest.php index 8dcc8cff..a65ce5ad 100644 --- a/tests/src/Builder/Generator/Step/ProcessSharedSourceFilesStepTest.php +++ b/tests/src/Builder/Generator/Step/ProcessSharedSourceFilesStepTest.php @@ -40,12 +40,14 @@ final class ProcessSharedSourceFilesStepTest extends Tests\ContainerAwareTestCas protected function setUp(): void { + parent::setUp(); + $step = $this->findStep(); - $this->subject = self::$container->get(Src\Builder\Generator\Step\ProcessSharedSourceFilesStep::class); + $this->subject = $this->container->get(Src\Builder\Generator\Step\ProcessSharedSourceFilesStep::class); $this->subject->setConfig($step); $this->result = new Src\Builder\BuildResult( - new Src\Builder\BuildInstructions(self::$config, 'foo'), + new Src\Builder\BuildInstructions($this->config, 'foo'), ); } @@ -82,7 +84,7 @@ public function revertRemovesProcessedFiles(): void self::assertFileDoesNotExist($this->result->getInstructions()->getTemporaryDirectory().'/shared-dummy.yaml'); } - protected static function createConfig(): Src\Builder\Config\Config + protected function createConfig(): Src\Builder\Config\Config { $configFactory = Src\Builder\Config\ConfigFactory::create(); @@ -94,7 +96,7 @@ protected static function createConfig(): Src\Builder\Config\Config private function findStep(): Src\Builder\Config\ValueObject\Step { - foreach (self::$config->getSteps() as $step) { + foreach ($this->config->getSteps() as $step) { if (Src\Builder\Generator\Step\ProcessSharedSourceFilesStep::getType() === $step->getType()) { return $step; } diff --git a/tests/src/Builder/Generator/Step/ProcessSourceFilesStepTest.php b/tests/src/Builder/Generator/Step/ProcessSourceFilesStepTest.php index b4a543d0..22ea501e 100644 --- a/tests/src/Builder/Generator/Step/ProcessSourceFilesStepTest.php +++ b/tests/src/Builder/Generator/Step/ProcessSourceFilesStepTest.php @@ -43,12 +43,14 @@ final class ProcessSourceFilesStepTest extends Tests\ContainerAwareTestCase protected function setUp(): void { + parent::setUp(); + $step = $this->findStep(); - $this->subject = self::$container->get(Src\Builder\Generator\Step\ProcessSourceFilesStep::class); + $this->subject = $this->container->get(Src\Builder\Generator\Step\ProcessSourceFilesStep::class); $this->subject->setConfig($step); $this->result = new Src\Builder\BuildResult( - new Src\Builder\BuildInstructions(self::$config, 'foo'), + new Src\Builder\BuildInstructions($this->config, 'foo'), ); } @@ -162,7 +164,7 @@ public static function runCanProcessTheSameSourceFileWithMultipleConditionsDataP ]; } - protected static function createConfig(): Src\Builder\Config\Config + protected function createConfig(): Src\Builder\Config\Config { $configFactory = Src\Builder\Config\ConfigFactory::create(); @@ -174,7 +176,7 @@ protected static function createConfig(): Src\Builder\Config\Config private function findStep(): Src\Builder\Config\ValueObject\Step { - foreach (self::$config->getSteps() as $step) { + foreach ($this->config->getSteps() as $step) { if (Src\Builder\Generator\Step\ProcessSourceFilesStep::getType() === $step->getType()) { return $step; } diff --git a/tests/src/Builder/Generator/Step/RunCommandStepTest.php b/tests/src/Builder/Generator/Step/RunCommandStepTest.php index d3cc3fca..5cc57028 100644 --- a/tests/src/Builder/Generator/Step/RunCommandStepTest.php +++ b/tests/src/Builder/Generator/Step/RunCommandStepTest.php @@ -25,6 +25,8 @@ use CPSIT\ProjectBuilder as Src; use CPSIT\ProjectBuilder\Tests; +use Generator; +use LogicException; use PHPUnit\Framework; use Symfony\Component\Filesystem; @@ -38,16 +40,24 @@ final class RunCommandStepTest extends Tests\ContainerAwareTestCase { private Src\Builder\Generator\Step\RunCommandStep $subject; private Src\Builder\BuildResult $result; + private Filesystem\Filesystem $filesystem; protected function setUp(): void { - $this->subject = self::$container->get(Src\Builder\Generator\Step\RunCommandStep::class); + parent::setUp(); + + $this->subject = $this->container->get(Src\Builder\Generator\Step\RunCommandStep::class); $this->result = new Src\Builder\BuildResult( new Src\Builder\BuildInstructions( - self::$config, + $this->config, 'foo', ), ); + $this->filesystem = new Filesystem\Filesystem(); + + if (!$this->filesystem->exists($this->result->getWrittenDirectory())) { + $this->filesystem->mkdir($this->result->getWrittenDirectory()); + } } #[Framework\Attributes\Test] @@ -62,7 +72,7 @@ public function runThrowsExceptionIfNoCommandIsGiven(): void #[Framework\Attributes\Test] public function runThrowsExceptionIfRevertingIsAttempted(): never { - $this->expectException('\LogicException'); + $this->expectException(LogicException::class); $this->expectExceptionCode(1687518806); $this->expectExceptionMessage('An already run command cannot be reverted.'); $this->subject->revert($this->result); @@ -77,7 +87,7 @@ public function runCommandIsSupported(): void } #[Framework\Attributes\Test] - public function runExecutesCommandWithoutConfirmationIfSKipConfirmationIsConfigured(): void + public function runExecutesCommandWithoutConfirmationIfSkipConfirmationIsConfigured(): void { $this->subject->setConfig( new Src\Builder\Config\ValueObject\Step( @@ -89,16 +99,28 @@ public function runExecutesCommandWithoutConfirmationIfSKipConfirmationIsConfigu ), ); - $workingDirectory = $this->result->getWrittenDirectory(); - - $fileSystem = new Filesystem\Filesystem(); - if (!$fileSystem->exists($workingDirectory)) { - $fileSystem->mkdir($workingDirectory); - } - self::assertTrue($this->subject->run($this->result)); self::assertFalse($this->subject->isStopped()); - self::assertStringNotContainsString('Do you wish to run this command?', self::$io->getOutput()); + self::assertStringNotContainsString('Do you wish to run this command?', $this->io->getOutput()); + } + + #[Framework\Attributes\Test] + #[Framework\Attributes\DataProvider('runDoesNotExecuteCommandAndRespectsExecutionRequirementDataProvider')] + public function runDoesNotExecuteCommandAndRespectsExecutionRequirement(bool $required, bool $expected): void + { + $this->subject->setConfig( + new Src\Builder\Config\ValueObject\Step( + Src\Builder\Generator\Step\RunCommandStep::getType(), + new Src\Builder\Config\ValueObject\StepOptions( + command: 'echo \'foo\'', + required: $required, + ), + ), + ); + + $this->io->setUserInputs(['no']); + self::assertSame($expected, $this->subject->run($this->result)); + self::assertTrue($this->subject->isStopped()); } #[Framework\Attributes\Test] @@ -114,16 +136,9 @@ public function runExecutesCommandAndAllowsExecutionFailures(): void ), ); - $workingDirectory = $this->result->getWrittenDirectory(); - - $fileSystem = new Filesystem\Filesystem(); - if (!$fileSystem->exists($workingDirectory)) { - $fileSystem->mkdir($workingDirectory); - } - self::assertTrue($this->subject->run($this->result)); self::assertFalse($this->subject->isStopped()); - self::assertStringContainsString('not found', self::$io->getOutput()); + self::assertStringContainsString('not found', $this->io->getOutput()); } #[Framework\Attributes\Test] @@ -138,7 +153,7 @@ public function negatedQuestionForExecutionResultsInStoppedRun(): void ), ); - self::$io->setUserInputs(['no']); + $this->io->setUserInputs(['no']); self::assertFalse($this->subject->run($this->result)); self::assertTrue($this->subject->isStopped()); } @@ -155,19 +170,23 @@ public function invalidCommandPrintProcessErrorMessage(): void ), ); - $workingDirectory = $this->result->getWrittenDirectory(); - - $fileSystem = new Filesystem\Filesystem(); - if (!$fileSystem->exists($workingDirectory)) { - $fileSystem->mkdir($workingDirectory); - } - - self::$io->setUserInputs(['yes']); - $actual = $this->subject->run($this->result); - self::$io->getOutput(); + $this->io->setUserInputs(['yes']); + self::assertFalse($this->subject->run($this->result)); + } - self::assertFalse($actual); + /** + * @return Generator + */ + public static function runDoesNotExecuteCommandAndRespectsExecutionRequirementDataProvider(): Generator + { + yield 'required' => [true, false]; + yield 'optional' => [false, true]; + } - $fileSystem->remove($workingDirectory); + protected function tearDown(): void + { + if ($this->filesystem->exists($this->result->getWrittenDirectory())) { + $this->filesystem->remove($this->result->getWrittenDirectory()); + } } } diff --git a/tests/src/Builder/Generator/Step/ShowNextStepsStepTest.php b/tests/src/Builder/Generator/Step/ShowNextStepsStepTest.php index 6b0fbc27..f7274a17 100644 --- a/tests/src/Builder/Generator/Step/ShowNextStepsStepTest.php +++ b/tests/src/Builder/Generator/Step/ShowNextStepsStepTest.php @@ -42,9 +42,11 @@ final class ShowNextStepsStepTest extends Tests\ContainerAwareTestCase protected function setUp(): void { - $this->subject = self::$container->get(Src\Builder\Generator\Step\ShowNextStepsStep::class); + parent::setUp(); + + $this->subject = $this->container->get(Src\Builder\Generator\Step\ShowNextStepsStep::class); $this->result = new Src\Builder\BuildResult( - new Src\Builder\BuildInstructions(self::$config, 'foo'), + new Src\Builder\BuildInstructions($this->config, 'foo'), ); } @@ -109,7 +111,7 @@ public function runShowsNextStepsFromRenderedTemplateFileAndAppliesStep(): void ); $actual = $this->subject->run($this->result); - $output = self::$io->getOutput(); + $output = $this->io->getOutput(); self::assertTrue($actual); self::assertStringContainsString('Next steps', $output); diff --git a/tests/src/Builder/Generator/Step/StepFactoryTest.php b/tests/src/Builder/Generator/Step/StepFactoryTest.php index de78c7c2..d3ca2d64 100644 --- a/tests/src/Builder/Generator/Step/StepFactoryTest.php +++ b/tests/src/Builder/Generator/Step/StepFactoryTest.php @@ -39,7 +39,9 @@ final class StepFactoryTest extends Tests\ContainerAwareTestCase protected function setUp(): void { - $this->subject = self::$container->get(Src\Builder\Generator\Step\StepFactory::class); + parent::setUp(); + + $this->subject = $this->container->get(Src\Builder\Generator\Step\StepFactory::class); } #[Framework\Attributes\Test] diff --git a/tests/src/Builder/Writer/GenericFileWriterTest.php b/tests/src/Builder/Writer/GenericFileWriterTest.php index 97135d65..64210394 100644 --- a/tests/src/Builder/Writer/GenericFileWriterTest.php +++ b/tests/src/Builder/Writer/GenericFileWriterTest.php @@ -44,14 +44,16 @@ final class GenericFileWriterTest extends Tests\ContainerAwareTestCase protected function setUp(): void { - $this->subject = self::$container->get(Src\Builder\Writer\GenericFileWriter::class); + parent::setUp(); + + $this->subject = $this->container->get(Src\Builder\Writer\GenericFileWriter::class); } #[Framework\Attributes\Test] public function writeCopiesGivenFileToTemporaryDirectory(): void { $instructions = new Src\Builder\BuildInstructions( - self::$container->get('app.config'), + $this->container->get('app.config'), 'foo', ); $sourceFile = __FILE__; @@ -70,7 +72,7 @@ public function writeCopiesGivenFileToTemporaryDirectory(): void public function writeCopiesGivenFileToGivenTargetFile(): void { $instructions = new Src\Builder\BuildInstructions( - self::$container->get('app.config'), + $this->container->get('app.config'), 'foo', ); $sourceFile = __FILE__; diff --git a/tests/src/Builder/Writer/JsonFileWriterTest.php b/tests/src/Builder/Writer/JsonFileWriterTest.php index 07565be2..b2f5a51e 100644 --- a/tests/src/Builder/Writer/JsonFileWriterTest.php +++ b/tests/src/Builder/Writer/JsonFileWriterTest.php @@ -41,7 +41,9 @@ final class JsonFileWriterTest extends Tests\ContainerAwareTestCase protected function setUp(): void { - $this->subject = self::$container->get(Src\Builder\Writer\JsonFileWriter::class); + parent::setUp(); + + $this->subject = $this->container->get(Src\Builder\Writer\JsonFileWriter::class); } #[Framework\Attributes\Test] @@ -65,7 +67,7 @@ public static function writeDumpsJsonToGivenFileDataProvider(): Generator { yield 'json string' => ['{"foo":"baz"}', '{"foo":"baz"}']; yield 'serializable json object' => [ - new class() implements JsonSerializable { + new class implements JsonSerializable { /** * @return array{'foo': string} */ diff --git a/tests/src/Builder/Writer/TemplateWriterTest.php b/tests/src/Builder/Writer/TemplateWriterTest.php index f3c597ff..8c89b1a8 100644 --- a/tests/src/Builder/Writer/TemplateWriterTest.php +++ b/tests/src/Builder/Writer/TemplateWriterTest.php @@ -44,14 +44,16 @@ final class TemplateWriterTest extends Tests\ContainerAwareTestCase protected function setUp(): void { - $this->subject = self::$container->get(Src\Builder\Writer\TemplateWriter::class); + parent::setUp(); + + $this->subject = $this->container->get(Src\Builder\Writer\TemplateWriter::class); } #[Framework\Attributes\Test] public function writeWritesRenderedTemplateFileToTemporaryDirectory(): void { $instructions = new Src\Builder\BuildInstructions( - self::$container->get('app.config'), + $this->container->get('app.config'), 'foo', ); $instructions->addTemplateVariable('foo', 'foo'); @@ -85,7 +87,7 @@ public function writeWritesRenderedTemplateFileToTemporaryDirectory(): void public function writeWritesRenderedTemplateFileToGivenTargetFile(): void { $instructions = new Src\Builder\BuildInstructions( - self::$container->get('app.config'), + $this->container->get('app.config'), 'foo', ); $instructions->addTemplateVariable('foo', 'foo'); diff --git a/tests/src/Builder/Writer/WriterFactoryTest.php b/tests/src/Builder/Writer/WriterFactoryTest.php index 4d2a833a..2bc5e37a 100644 --- a/tests/src/Builder/Writer/WriterFactoryTest.php +++ b/tests/src/Builder/Writer/WriterFactoryTest.php @@ -39,7 +39,9 @@ final class WriterFactoryTest extends Tests\ContainerAwareTestCase protected function setUp(): void { - $this->subject = self::$container->get(Src\Builder\Writer\WriterFactory::class); + parent::setUp(); + + $this->subject = $this->container->get(Src\Builder\Writer\WriterFactory::class); } #[Framework\Attributes\Test] diff --git a/tests/src/ClearableBufferIO.php b/tests/src/ClearableBufferIO.php index b2a8e117..3ccc1f56 100644 --- a/tests/src/ClearableBufferIO.php +++ b/tests/src/ClearableBufferIO.php @@ -26,9 +26,6 @@ use Composer\IO; use Symfony\Component\Console; -use function fseek; -use function ftruncate; - /** * ClearableBufferIO. * @@ -39,42 +36,6 @@ */ final class ClearableBufferIO extends IO\BufferIO { - /** - * @var callable - */ - private $restoreInitialState; - - /** - * @phpstan-param Console\Output\OutputInterface::VERBOSITY_* $verbosity - */ - public function __construct( - string $input = '', - int $verbosity = Console\Output\OutputInterface::VERBOSITY_NORMAL, - ?Console\Formatter\OutputFormatterInterface $formatter = null, - ) { - parent::__construct($input, $verbosity, $formatter); - - $this->restoreInitialState = function () use ($input, $verbosity, $formatter) { - $this->input = new Console\Input\StringInput($input); - $this->input->setInteractive(false); - - $this->clear(); - $this->output->setVerbosity($verbosity); - $this->output->setDecorated(null !== $formatter && $formatter->isDecorated()); - }; - } - - public function reset(): void - { - ($this->restoreInitialState)(); - } - - public function clear(): void - { - ftruncate($this->output->getStream(), 0); - fseek($this->output->getStream(), 0); - } - public function makeInteractive(bool $interactive = true): self { $this->input->setInteractive($interactive); diff --git a/tests/src/Console/Command/CreateProjectCommandTest.php b/tests/src/Console/Command/CreateProjectCommandTest.php index f8eb13df..68c98964 100644 --- a/tests/src/Console/Command/CreateProjectCommandTest.php +++ b/tests/src/Console/Command/CreateProjectCommandTest.php @@ -53,11 +53,13 @@ final class CreateProjectCommandTest extends Tests\ContainerAwareTestCase protected function setUp(): void { + parent::setUp(); + $configReader = Src\Builder\Config\ConfigReader::create(dirname(__DIR__, 2).'/Fixtures/Templates'); - $this->messenger = self::$container->get('app.messenger'); + $this->messenger = $this->container->get('app.messenger'); $this->targetDirectory = Src\Helper\FilesystemHelper::getNewTemporaryDirectory(); - $this->filesystem = self::$container->get(Filesystem\Filesystem::class); + $this->filesystem = $this->container->get(Filesystem\Filesystem::class); $this->templateProvider = new Tests\Fixtures\DummyProvider(); $this->cacheableTemplateProvider = new Tests\Fixtures\DummyCacheableProvider($this->messenger, $this->filesystem); @@ -71,13 +73,13 @@ protected function setUp(): void $this->commandTester = new SymfonyConsole\Tester\CommandTester($command); - self::$io->makeInteractive(); + $this->io->makeInteractive(); } #[Framework\Attributes\Test] public function createReturnsInstanceWithGivenMessenger(): void { - self::$io->makeInteractive(false); + $this->io->makeInteractive(false); $input = new SymfonyConsole\Input\ArrayInput([ 'target-directory' => 'foo', @@ -89,20 +91,20 @@ public function createReturnsInstanceWithGivenMessenger(): void self::assertStringContainsString( 'This command cannot be run in non-interactive mode.', - self::$io->getOutput(), + $this->io->getOutput(), ); } #[Framework\Attributes\Test] public function executeThrowsExceptionIfInputIsNonInteractive(): void { - self::$io->makeInteractive(false); + $this->io->makeInteractive(false); self::assertSame(1, $this->commandTester->execute([ 'target-directory' => $this->targetDirectory, ])); - $output = self::$io->getOutput(); + $output = $this->io->getOutput(); self::assertStringContainsString('This command cannot be run in non-interactive mode.', $output); } @@ -110,7 +112,7 @@ public function executeThrowsExceptionIfInputIsNonInteractive(): void #[Framework\Attributes\Test] public function executeShowsWelcomeScreen(): void { - self::$io->setUserInputs(['no']); + $this->io->setUserInputs(['no']); try { $this->commandTester->execute([ @@ -120,7 +122,7 @@ public function executeShowsWelcomeScreen(): void // Intended fallthrough. } - $output = self::$io->getOutput(); + $output = $this->io->getOutput(); self::assertStringContainsString('Welcome to the Project Builder', $output); } @@ -128,7 +130,7 @@ public function executeShowsWelcomeScreen(): void #[Framework\Attributes\Test] public function executeAllowsSelectingADifferentTemplateProviderIfTheSelectedProviderProvidesNoTemplates(): void { - self::$io->setUserInputs(['yes', '', 'no']); + $this->io->setUserInputs(['yes', '', 'no']); try { $this->commandTester->execute([ @@ -138,7 +140,7 @@ public function executeAllowsSelectingADifferentTemplateProviderIfTheSelectedPro // Intended fallthrough. } - $output = self::$io->getOutput(); + $output = $this->io->getOutput(); self::assertStringContainsStringMultipleTimes('Fetching templates from https://www.example.com ...', $output); self::assertStringContainsString('Where can we find the project template?', $output); @@ -151,7 +153,7 @@ public function executeAllowsSelectingADifferentTemplateProviderIfTheSelectedPro $this->createTemplateSource(), ]; - self::$io->setUserInputs(['1', '']); + $this->io->setUserInputs(['1', '']); try { $this->commandTester->execute([ @@ -161,7 +163,7 @@ public function executeAllowsSelectingADifferentTemplateProviderIfTheSelectedPro // Intended fallthrough. } - $output = self::$io->getOutput(); + $output = $this->io->getOutput(); self::assertStringContainsStringMultipleTimes('Fetching templates from https://www.example.com ...', $output); self::assertStringContainsStringMultipleTimes('Try a different provider (e.g. Satis or GitHub)', $output); @@ -172,7 +174,7 @@ public function executeFailsIfProjectGenerationIsAborted(): void { $this->filesystem->dumpFile($this->targetDirectory.'/foo', 'baz'); - self::$io->setUserInputs(['no']); + $this->io->setUserInputs(['no']); self::assertSame(2, $this->commandTester->execute([ 'target-directory' => $this->targetDirectory, @@ -187,14 +189,14 @@ public function executeHandlesErrorDuringProjectGeneration(): void $this->createTemplateSource(), ]; - self::$io->setUserInputs(['', '', '', '', 'no']); + $this->io->setUserInputs(['', '', '', '', 'no']); self::assertSame(1, $this->commandTester->execute([ 'target-directory' => $this->targetDirectory, ])); self::assertStringContainsString( 'Running step "collectBuildInstructions" failed. All applied steps were reverted. [1652954290]', - self::$io->getOutput(), + $this->io->getOutput(), ); } @@ -203,7 +205,7 @@ public function executeSkipsOverwriteConfirmationIfForceOptionIsGiven(): void { $this->filesystem->dumpFile($this->targetDirectory.'/foo', 'baz'); - self::$io->setUserInputs(['no']); + $this->io->setUserInputs(['no']); try { $this->commandTester->execute([ @@ -214,7 +216,7 @@ public function executeSkipsOverwriteConfirmationIfForceOptionIsGiven(): void // Intended fallthrough. } - $output = self::$io->getOutput(); + $output = $this->io->getOutput(); self::assertStringNotContainsString( sprintf('The target directory "%s" is not empty.', $this->targetDirectory), @@ -230,7 +232,7 @@ public function executeDisablesTemplateSourceCacheIfNoCacheOptionIsGiven(): void $this->createTemplateSource(), ]; - self::$io->setUserInputs(['yes', '1']); + $this->io->setUserInputs(['yes', '1']); try { $this->commandTester->execute([ @@ -252,13 +254,13 @@ public function executeGeneratesNewProjectFromSelectedTemplateAndShowsNumberOfPr $this->createTemplateSource(), ]; - self::$io->setUserInputs(['', '', 'foo', 'yes']); + $this->io->setUserInputs(['', '', 'foo', 'yes']); $this->commandTester->execute([ 'target-directory' => $this->targetDirectory, ]); - $output = self::$io->getOutput(); + $output = $this->io->getOutput(); self::assertSame(0, $this->commandTester->getStatusCode()); self::assertStringContainsString( @@ -276,14 +278,14 @@ public function executeGeneratesNewProjectFromSelectedTemplateAndShowsAllProcess $this->createTemplateSource(), ]; - self::$io->setVerbosity(SymfonyConsole\Output\OutputInterface::VERBOSITY_VERBOSE); - self::$io->setUserInputs(['', '', 'foo', 'yes']); + $this->io->setVerbosity(SymfonyConsole\Output\OutputInterface::VERBOSITY_VERBOSE); + $this->io->setUserInputs(['', '', 'foo', 'yes']); $this->commandTester->execute([ 'target-directory' => $this->targetDirectory, ]); - $output = self::$io->getOutput(); + $output = $this->io->getOutput(); self::assertSame(0, $this->commandTester->getStatusCode()); self::assertStringContainsString('* dummy.json', $output); diff --git a/tests/src/Console/Command/ProxyCommandTest.php b/tests/src/Console/Command/ProxyCommandTest.php index f5a7c743..644a48f1 100644 --- a/tests/src/Console/Command/ProxyCommandTest.php +++ b/tests/src/Console/Command/ProxyCommandTest.php @@ -43,6 +43,8 @@ final class ProxyCommandTest extends Tests\ContainerAwareTestCase protected function setUp(): void { + parent::setUp(); + $this->command = new Tests\Fixtures\DummyCommand(); $this->subject = new Src\Console\Command\ProxyCommand( fn (Src\IO\Messenger $messenger) => $this->command->setMessenger($messenger), diff --git a/tests/src/Console/IO/AccessibleConsoleIOTest.php b/tests/src/Console/IO/AccessibleConsoleIOTest.php index 735c99d9..086708db 100644 --- a/tests/src/Console/IO/AccessibleConsoleIOTest.php +++ b/tests/src/Console/IO/AccessibleConsoleIOTest.php @@ -41,7 +41,9 @@ final class AccessibleConsoleIOTest extends Tests\ContainerAwareTestCase protected function setUp(): void { - $this->subject = Src\Console\IO\AccessibleConsoleIO::fromIO(self::$io); + parent::setUp(); + + $this->subject = Src\Console\IO\AccessibleConsoleIO::fromIO($this->io); } #[Framework\Attributes\Test] @@ -70,17 +72,17 @@ public function fromIOConstructsInputAndOutputIfIOIsNotConsoleIO(): void #[Framework\Attributes\Test] public function getInputReturnsInput(): void { - self::$io->makeInteractive(); + $this->io->makeInteractive(); $input = $this->subject->getInput(); self::assertTrue($input->isInteractive()); - self::assertTrue(self::$io->isInteractive()); + self::assertTrue($this->io->isInteractive()); $input->setInteractive(false); self::assertFalse($input->isInteractive()); - self::assertFalse(self::$io->isInteractive()); + self::assertFalse($this->io->isInteractive()); } #[Framework\Attributes\Test] @@ -89,6 +91,6 @@ public function getOutputReturnsOutput(): void $output = $this->subject->getOutput(); $output->write('hello world'); - self::assertSame('hello world', self::$io->getOutput()); + self::assertSame('hello world', $this->io->getOutput()); } } diff --git a/tests/src/ContainerAwareTestCase.php b/tests/src/ContainerAwareTestCase.php index f4a1ddf5..80573694 100644 --- a/tests/src/ContainerAwareTestCase.php +++ b/tests/src/ContainerAwareTestCase.php @@ -42,23 +42,23 @@ */ abstract class ContainerAwareTestCase extends Framework\TestCase { - protected static DependencyInjection\ContainerInterface $container; - protected static ClearableBufferIO $io; - protected static Handler\MockHandler $mockHandler; - protected static Src\Builder\Config\Config $config; + protected DependencyInjection\ContainerInterface $container; + protected ClearableBufferIO $io; + protected Handler\MockHandler $mockHandler; + protected Src\Builder\Config\Config $config; - public static function setUpBeforeClass(): void + protected function setUp(): void { - self::$io = static::createIO(); - self::$config = static::createConfig(); + $this->io = $this->createIO(); + $this->config = $this->createConfig(); - self::$container = Src\DependencyInjection\ContainerFactory::createForTesting()->get(); - self::$container->set('app.messenger', Src\IO\Messenger::create(self::$io)); - self::$container->set('app.config', self::$config); - self::$container->set(Client\ClientInterface::class, static::createClient()); + $this->container = Src\DependencyInjection\ContainerFactory::createForTesting()->get(); + $this->container->set('app.messenger', Src\IO\Messenger::create($this->io)); + $this->container->set('app.config', $this->config); + $this->container->set(Client\ClientInterface::class, $this->createClient()); } - protected static function createConfig(): Src\Builder\Config\Config + protected function createConfig(): Src\Builder\Config\Config { $config = new Src\Builder\Config\Config( 'test', @@ -94,16 +94,16 @@ protected static function createConfig(): Src\Builder\Config\Config return $config; } - protected static function createIO(): ClearableBufferIO + protected function createIO(): ClearableBufferIO { return new ClearableBufferIO(); } - protected static function createClient(): Client\ClientInterface + protected function createClient(): Client\ClientInterface { - self::$mockHandler = new Handler\MockHandler(); + $this->mockHandler = new Handler\MockHandler(); - $handler = new HandlerStack(self::$mockHandler); + $handler = new HandlerStack($this->mockHandler); return new \GuzzleHttp\Client(['handler' => $handler]); } @@ -124,10 +124,4 @@ protected static function createErroneousResponse(int $statusCode = 500): Messag { return new Psr7\Response($statusCode, [], 'Something went wrong.'); } - - protected function tearDown(): void - { - self::$io->reset(); - self::$mockHandler->reset(); - } } diff --git a/tests/src/Error/ErrorHandlerTest.php b/tests/src/Error/ErrorHandlerTest.php index 7c9a165c..ae1e56dd 100644 --- a/tests/src/Error/ErrorHandlerTest.php +++ b/tests/src/Error/ErrorHandlerTest.php @@ -46,7 +46,9 @@ final class ErrorHandlerTest extends Tests\ContainerAwareTestCase protected function setUp(): void { - $this->subject = new Src\Error\ErrorHandler(self::$container->get('app.messenger')); + parent::setUp(); + + $this->subject = new Src\Error\ErrorHandler($this->container->get('app.messenger')); } /** @@ -58,7 +60,7 @@ public function handleExceptionWritesFormattedErrorMessage(Throwable $exception, { $this->subject->handleException($exception); - $output = self::$io->getOutput(); + $output = $this->io->getOutput(); foreach ($expectedOutput as $expected) { self::assertStringContainsString($expected, $output); diff --git a/tests/src/Event/BeforeTemplateRenderedEventTest.php b/tests/src/Event/BeforeTemplateRenderedEventTest.php index ea8d185d..d926a5cc 100644 --- a/tests/src/Event/BeforeTemplateRenderedEventTest.php +++ b/tests/src/Event/BeforeTemplateRenderedEventTest.php @@ -41,9 +41,11 @@ final class BeforeTemplateRenderedEventTest extends Tests\ContainerAwareTestCase protected function setUp(): void { - $this->buildInstructions = new Src\Builder\BuildInstructions(self::$config, 'foo'); + parent::setUp(); + + $this->buildInstructions = new Src\Builder\BuildInstructions($this->config, 'foo'); $this->subject = new Src\Event\BeforeTemplateRenderedEvent( - self::$container->get(Environment::class), + $this->container->get(Environment::class), $this->buildInstructions, [ 'foo' => true, @@ -56,7 +58,7 @@ protected function setUp(): void public function getTwigReturnsTwigEnvironment(): void { self::assertSame( - self::$container->get(Environment::class), + $this->container->get(Environment::class), $this->subject->getTwig(), ); } diff --git a/tests/src/Event/BuildInstructionCollectedEventTest.php b/tests/src/Event/BuildInstructionCollectedEventTest.php index ed611059..13451080 100644 --- a/tests/src/Event/BuildInstructionCollectedEventTest.php +++ b/tests/src/Event/BuildInstructionCollectedEventTest.php @@ -42,6 +42,8 @@ final class BuildInstructionCollectedEventTest extends Tests\ContainerAwareTestC protected function setUp(): void { + parent::setUp(); + $this->subProperty = new Src\Builder\Config\ValueObject\SubProperty( 'bar', 'Bar', @@ -60,7 +62,7 @@ protected function setUp(): void ], ); $this->buildResult = new Src\Builder\BuildResult( - new Src\Builder\BuildInstructions(self::$config, 'foo'), + new Src\Builder\BuildInstructions($this->config, 'foo'), ); $this->subject = new Src\Event\BuildInstructionCollectedEvent( $this->property, diff --git a/tests/src/Event/BuildStepProcessedEventTest.php b/tests/src/Event/BuildStepProcessedEventTest.php index bc6c96d7..dd3836f8 100644 --- a/tests/src/Event/BuildStepProcessedEventTest.php +++ b/tests/src/Event/BuildStepProcessedEventTest.php @@ -41,9 +41,11 @@ final class BuildStepProcessedEventTest extends Tests\ContainerAwareTestCase protected function setUp(): void { + parent::setUp(); + $this->step = new Tests\Fixtures\DummyStep(); $this->buildResult = new Src\Builder\BuildResult( - new Src\Builder\BuildInstructions(self::$config, 'foo'), + new Src\Builder\BuildInstructions($this->config, 'foo'), ); $this->subject = new Src\Event\BuildStepProcessedEvent( $this->step, diff --git a/tests/src/Event/BuildStepRevertedEventTest.php b/tests/src/Event/BuildStepRevertedEventTest.php index f72d6fda..72f6345a 100644 --- a/tests/src/Event/BuildStepRevertedEventTest.php +++ b/tests/src/Event/BuildStepRevertedEventTest.php @@ -41,9 +41,11 @@ final class BuildStepRevertedEventTest extends Tests\ContainerAwareTestCase protected function setUp(): void { + parent::setUp(); + $this->step = new Tests\Fixtures\DummyStep(); $this->buildResult = new Src\Builder\BuildResult( - new Src\Builder\BuildInstructions(self::$config, 'foo'), + new Src\Builder\BuildInstructions($this->config, 'foo'), ); $this->subject = new Src\Event\BuildStepRevertedEvent( $this->step, diff --git a/tests/src/Event/ProjectBuildFinishedEventTest.php b/tests/src/Event/ProjectBuildFinishedEventTest.php index 36fe3441..9a35de1b 100644 --- a/tests/src/Event/ProjectBuildFinishedEventTest.php +++ b/tests/src/Event/ProjectBuildFinishedEventTest.php @@ -40,8 +40,10 @@ final class ProjectBuildFinishedEventTest extends Tests\ContainerAwareTestCase protected function setUp(): void { + parent::setUp(); + $this->buildResult = new Src\Builder\BuildResult( - new Src\Builder\BuildInstructions(self::$config, 'foo'), + new Src\Builder\BuildInstructions($this->config, 'foo'), ); $this->subject = new Src\Event\ProjectBuildFinishedEvent( $this->buildResult, diff --git a/tests/src/Event/ProjectBuildStartedEventTest.php b/tests/src/Event/ProjectBuildStartedEventTest.php index d16b8afd..d2c07fb4 100644 --- a/tests/src/Event/ProjectBuildStartedEventTest.php +++ b/tests/src/Event/ProjectBuildStartedEventTest.php @@ -40,7 +40,9 @@ final class ProjectBuildStartedEventTest extends Tests\ContainerAwareTestCase protected function setUp(): void { - $this->buildInstructions = new Src\Builder\BuildInstructions(self::$config, 'foo'); + parent::setUp(); + + $this->buildInstructions = new Src\Builder\BuildInstructions($this->config, 'foo'); $this->subject = new Src\Event\ProjectBuildStartedEvent( $this->buildInstructions, ); diff --git a/tests/src/Fixtures/Templates/json-template/composer.json b/tests/src/Fixtures/Templates/json-template/composer.json index 7249fe12..1d885276 100644 --- a/tests/src/Fixtures/Templates/json-template/composer.json +++ b/tests/src/Fixtures/Templates/json-template/composer.json @@ -2,7 +2,7 @@ "name": "cpsit/project-builder-template-json", "type": "project-builder-template", "require": { - "php": "~8.1.0 || ~8.2.0 || ~8.3.0" + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" }, "require-dev": { "phpunit/phpunit": "^9.5" diff --git a/tests/src/Fixtures/Templates/yaml-template/composer.json b/tests/src/Fixtures/Templates/yaml-template/composer.json index aad054f1..2d269265 100644 --- a/tests/src/Fixtures/Templates/yaml-template/composer.json +++ b/tests/src/Fixtures/Templates/yaml-template/composer.json @@ -2,7 +2,7 @@ "name": "cpsit/project-builder-template-yaml", "type": "project-builder-template", "require": { - "php": "~8.1.0 || ~8.2.0 || ~8.3.0" + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" }, "require-dev": { "phpunit/phpunit": "^9.5" diff --git a/tests/src/IO/InputReaderTest.php b/tests/src/IO/InputReaderTest.php index aeb8b7a2..24b42daf 100644 --- a/tests/src/IO/InputReaderTest.php +++ b/tests/src/IO/InputReaderTest.php @@ -39,16 +39,18 @@ final class InputReaderTest extends Tests\ContainerAwareTestCase protected function setUp(): void { - $this->subject = new Src\IO\InputReader(self::$io); + parent::setUp(); + + $this->subject = new Src\IO\InputReader($this->io); } #[Framework\Attributes\Test] public function staticValueReturnsUserInput(): void { - self::$io->setUserInputs(['Bob']); + $this->io->setUserInputs(['Bob']); self::assertSame('Bob', $this->subject->staticValue('What\'s your name?', 'Alice')); - self::assertStringContainsString('What\'s your name? (optional) [Alice]', self::$io->getOutput()); + self::assertStringContainsString('What\'s your name? (optional) [Alice]', $this->io->getOutput()); } #[Framework\Attributes\Test] @@ -60,25 +62,25 @@ public function staticValueReturnsDefaultValue(): void #[Framework\Attributes\Test] public function staticValueReturnsTrimmedAnswerValue(): void { - self::$io->setUserInputs([' Bob ']); + $this->io->setUserInputs([' Bob ']); self::assertSame('Bob', $this->subject->staticValue('What\'s your name?')); } #[Framework\Attributes\Test] public function staticValueReturnsNullForEmptyAnswerValue(): void { - self::$io->setUserInputs([' ']); + $this->io->setUserInputs([' ']); self::assertNull($this->subject->staticValue('What\'s your name?')); } #[Framework\Attributes\Test] public function hiddenValueHidesUserInput(): void { - self::$io->setUserInputs(['s3cr3t']); + $this->io->setUserInputs(['s3cr3t']); self::assertSame('s3cr3t', $this->subject->hiddenValue('What\'s your password?')); - $output = self::$io->getOutput(); + $output = $this->io->getOutput(); self::assertStringContainsString('What\'s your password?', $output); self::assertStringNotContainsString('s3cr3t', $output); @@ -87,7 +89,7 @@ public function hiddenValueHidesUserInput(): void #[Framework\Attributes\Test] public function choicesReturnsEmptyArrayIfNoSelectionWasMade(): void { - self::$io->setUserInputs(['']); + $this->io->setUserInputs(['']); self::assertSame( [], diff --git a/tests/src/IO/MessengerTest.php b/tests/src/IO/MessengerTest.php index 4922185b..eff19196 100644 --- a/tests/src/IO/MessengerTest.php +++ b/tests/src/IO/MessengerTest.php @@ -46,7 +46,9 @@ final class MessengerTest extends Tests\ContainerAwareTestCase protected function setUp(): void { - $this->subject = self::$container->get('app.messenger'); + parent::setUp(); + + $this->subject = $this->container->get('app.messenger'); } #[Framework\Attributes\Test] @@ -54,10 +56,10 @@ public function selectProviderCanHandlePackagistProvider(): void { $packagistProvider = new Src\Template\Provider\PackagistProvider( $this->subject, - self::$container->get(Filesystem\Filesystem::class), + $this->container->get(Filesystem\Filesystem::class), ); - self::$io->setUserInputs(['']); + $this->io->setUserInputs(['']); self::assertSame($packagistProvider, $this->subject->selectProvider([$packagistProvider])); } @@ -67,10 +69,10 @@ public function selectProviderCanHandleCustomComposerProvider(): void { $customProvider = new Src\Template\Provider\ComposerProvider( $this->subject, - self::$container->get(Filesystem\Filesystem::class), + $this->container->get(Filesystem\Filesystem::class), ); - self::$io->setUserInputs(['', 'https://www.example.com']); + $this->io->setUserInputs(['', 'https://www.example.com']); self::assertSame($customProvider, $this->subject->selectProvider([$customProvider])); self::assertSame('https://www.example.com', $customProvider->getUrl()); @@ -96,10 +98,10 @@ public function selectTemplateSourceReturnsSelectedTemplateSource( $templateSource = new Src\Template\TemplateSource($provider, $package); $provider->templateSources = [$templateSource]; - self::$io->setUserInputs(['']); + $this->io->setUserInputs(['']); self::assertSame($templateSource, $this->subject->selectTemplateSource($provider)); - self::assertStringContainsString($expected, self::$io->getOutput()); + self::assertStringContainsString($expected, $this->io->getOutput()); } #[Framework\Attributes\Test] @@ -108,7 +110,7 @@ public function confirmTemplateSourceRetryAsksForConfirmationAndReturnsResult(st { $exception = new Exception('Something went wrong.'); - self::$io->setUserInputs([$input]); + $this->io->setUserInputs([$input]); self::assertSame($expected, $this->subject->confirmTemplateSourceRetry($exception)); self::assertStringContainsString( @@ -119,14 +121,14 @@ public function confirmTemplateSourceRetryAsksForConfirmationAndReturnsResult(st '', 'Continue? [Y/n]', ]), - self::$io->getOutput(), + $this->io->getOutput(), ); } #[Framework\Attributes\Test] public function confirmProjectRegenerationAsksForConfirmationAndReturnsResult(): void { - self::$io->setUserInputs(['yes']); + $this->io->setUserInputs(['yes']); self::assertTrue($this->subject->confirmProjectRegeneration()); self::assertStringContainsString( @@ -134,14 +136,14 @@ public function confirmProjectRegenerationAsksForConfirmationAndReturnsResult(): 'If you want, you can restart project generation now.', 'Restart? [Y/n]', ]), - self::$io->getOutput(), + $this->io->getOutput(), ); } #[Framework\Attributes\Test] public function confirmProjectGenerationAsksForRunCommandAndReturnsResult(): void { - self::$io->setUserInputs(['yes']); + $this->io->setUserInputs(['yes']); $dummyCommand = 'foo --bar'; @@ -154,7 +156,7 @@ public function confirmProjectGenerationAsksForRunCommandAndReturnsResult(): voi ), 'Do you wish to run this command? [Y/n]', ]), - self::$io->getOutput(), + $this->io->getOutput(), ); } @@ -163,7 +165,7 @@ public function isVerboseReturnsTrueIfVerbosityLevelIsVerbose(): void { self::assertFalse($this->subject->isVerbose()); - self::$io->setVerbosity(Console\Output\OutputInterface::VERBOSITY_VERBOSE); + $this->io->setVerbosity(Console\Output\OutputInterface::VERBOSITY_VERBOSE); self::assertTrue($this->subject->isVerbose()); } @@ -173,7 +175,7 @@ public function isVeryVerboseReturnsTrueIfVerbosityLevelIsVeryVerbose(): void { self::assertFalse($this->subject->isVeryVerbose()); - self::$io->setVerbosity(Console\Output\OutputInterface::VERBOSITY_VERY_VERBOSE); + $this->io->setVerbosity(Console\Output\OutputInterface::VERBOSITY_VERY_VERBOSE); self::assertTrue($this->subject->isVeryVerbose()); } @@ -183,7 +185,7 @@ public function isDebugReturnsTrueIfVerbosityLevelIsDebug(): void { self::assertFalse($this->subject->isDebug()); - self::$io->setVerbosity(Console\Output\OutputInterface::VERBOSITY_DEBUG); + $this->io->setVerbosity(Console\Output\OutputInterface::VERBOSITY_DEBUG); self::assertTrue($this->subject->isDebug()); } diff --git a/tests/src/IO/Validator/ValidatorFactoryTest.php b/tests/src/IO/Validator/ValidatorFactoryTest.php index d6ee8f88..92d287e5 100644 --- a/tests/src/IO/Validator/ValidatorFactoryTest.php +++ b/tests/src/IO/Validator/ValidatorFactoryTest.php @@ -40,7 +40,9 @@ final class ValidatorFactoryTest extends Tests\ContainerAwareTestCase protected function setUp(): void { - $this->subject = self::$container->get(Src\IO\Validator\ValidatorFactory::class); + parent::setUp(); + + $this->subject = $this->container->get(Src\IO\Validator\ValidatorFactory::class); } #[Framework\Attributes\Test] diff --git a/tests/src/Json/SchemaValidatorTest.php b/tests/src/Json/SchemaValidatorTest.php index dbbe7956..74e49060 100644 --- a/tests/src/Json/SchemaValidatorTest.php +++ b/tests/src/Json/SchemaValidatorTest.php @@ -42,7 +42,9 @@ final class SchemaValidatorTest extends Tests\ContainerAwareTestCase protected function setUp(): void { - $this->subject = self::$container->get(Src\Json\SchemaValidator::class); + parent::setUp(); + + $this->subject = $this->container->get(Src\Json\SchemaValidator::class); } #[Framework\Attributes\Test] diff --git a/tests/src/Naming/NameVariantBuilderTest.php b/tests/src/Naming/NameVariantBuilderTest.php index 37d84313..541a504c 100644 --- a/tests/src/Naming/NameVariantBuilderTest.php +++ b/tests/src/Naming/NameVariantBuilderTest.php @@ -43,8 +43,10 @@ final class NameVariantBuilderTest extends Tests\ContainerAwareTestCase protected function setUp(): void { + parent::setUp(); + $this->instructions = new Src\Builder\BuildInstructions( - self::$container->get('app.config'), + $this->container->get('app.config'), 'foo', ); $this->subject = new Src\Naming\NameVariantBuilder($this->instructions); diff --git a/tests/src/Resource/Http/PhpApiClientTest.php b/tests/src/Resource/Http/PhpApiClientTest.php index 40390c5d..2e81ed29 100644 --- a/tests/src/Resource/Http/PhpApiClientTest.php +++ b/tests/src/Resource/Http/PhpApiClientTest.php @@ -39,13 +39,15 @@ final class PhpApiClientTest extends Tests\ContainerAwareTestCase protected function setUp(): void { - $this->subject = self::$container->get(Src\Resource\Http\PhpApiClient::class); + parent::setUp(); + + $this->subject = $this->container->get(Src\Resource\Http\PhpApiClient::class); } #[Framework\Attributes\Test] public function getLatestStableVersionThrowsExceptionOnInvalidResponse(): void { - self::$mockHandler->append(self::createErroneousResponse()); + $this->mockHandler->append(self::createErroneousResponse()); $this->expectException(Src\Exception\HttpException::class); $this->expectExceptionCode(1652861804); @@ -57,7 +59,7 @@ public function getLatestStableVersionThrowsExceptionOnInvalidResponse(): void #[Framework\Attributes\Test] public function getLatestStableVersionReturnsLatestStableVersionOfGivenBranch(): void { - self::$mockHandler->append(self::createJsonResponse(['version' => '8.0.10'])); + $this->mockHandler->append(self::createJsonResponse(['version' => '8.0.10'])); self::assertSame('8.0.10', $this->subject->getLatestStableVersion('8.0')); } @@ -65,7 +67,7 @@ public function getLatestStableVersionReturnsLatestStableVersionOfGivenBranch(): #[Framework\Attributes\Test] public function getLatestStableVersionFallsBackToDotZeroReleaseIfResponseIsErroneous(): void { - self::$mockHandler->append(self::createJsonResponse(['error' => 'Unknown version'])); + $this->mockHandler->append(self::createJsonResponse(['error' => 'Unknown version'])); self::assertSame('8.2.0', $this->subject->getLatestStableVersion('8.2')); } diff --git a/tests/src/Resource/Local/ComposerTest.php b/tests/src/Resource/Local/ComposerTest.php index 04ae8a1e..200bb57a 100644 --- a/tests/src/Resource/Local/ComposerTest.php +++ b/tests/src/Resource/Local/ComposerTest.php @@ -45,7 +45,9 @@ final class ComposerTest extends Tests\ContainerAwareTestCase protected function setUp(): void { - $this->subject = self::$container->get(Src\Resource\Local\Composer::class); + parent::setUp(); + + $this->subject = $this->container->get(Src\Resource\Local\Composer::class); $this->composerJson = dirname(__DIR__, 2).'/Fixtures/Templates/yaml-template/composer.json'; } diff --git a/tests/src/Template/Provider/BaseProviderTest.php b/tests/src/Template/Provider/BaseProviderTest.php index d8d3e9d9..58b8502c 100644 --- a/tests/src/Template/Provider/BaseProviderTest.php +++ b/tests/src/Template/Provider/BaseProviderTest.php @@ -56,9 +56,11 @@ final class BaseProviderTest extends Tests\ContainerAwareTestCase protected function setUp(): void { + parent::setUp(); + $this->subject = new Tests\Fixtures\DummyComposerProvider( - self::$container->get('app.messenger'), - self::$container->get(Filesystem\Filesystem::class), + $this->container->get('app.messenger'), + $this->container->get(Filesystem\Filesystem::class), ); $this->server = new MockWebServer\MockWebServer(); $this->server->start(); @@ -140,7 +142,7 @@ public function installTemplateSourceThrowsExceptionIfInstallationFailsWithGiven $package = self::createPackage('foo/baz'); $templateSource = new Src\Template\TemplateSource($this->subject, $package); - self::$io->setUserInputs(['']); + $this->io->setUserInputs(['']); $this->expectExceptionObject(Src\Exception\InvalidTemplateSourceException::forFailedInstallation($templateSource)); @@ -157,13 +159,13 @@ public function installTemplateSourceFailsSoftlyIfGivenConstraintIsInvalid(): vo $this->mockPackagesServerResponse([$package]); - self::$io->setUserInputs(['foo', '']); + $this->io->setUserInputs(['foo', '']); $this->subject->installTemplateSource($templateSource); self::assertStringContainsString( 'Could not parse version constraint foo: Invalid version string "foo"', - self::$io->getOutput(), + $this->io->getOutput(), ); } @@ -177,7 +179,7 @@ public function installTemplateSourceFailsIfGivenConstraintCannotBeResolved(): v $this->mockPackagesServerResponse([$package]); - self::$io->setUserInputs(['^2.0', 'no']); + $this->io->setUserInputs(['^2.0', 'no']); $this->expectExceptionObject( Src\Exception\InvalidTemplateSourceException::forInvalidPackageVersionConstraint($templateSource, '^2.0'), @@ -196,13 +198,13 @@ public function installTemplateSourceAllowsSpecifyingOtherConstraintIfInstallati $this->mockPackagesServerResponse([$package]); - self::$io->setUserInputs(['^2.0', 'yes', '']); + $this->io->setUserInputs(['^2.0', 'yes', '']); self::assertFalse($templateSource->shouldUseDynamicVersionConstraint()); $this->subject->installTemplateSource($templateSource); - $output = self::$io->getOutput(); + $output = $this->io->getOutput(); self::assertStringContainsString('Installing project template (1.0.0)... Done', $output); self::assertTrue($templateSource->shouldUseDynamicVersionConstraint()); @@ -224,11 +226,11 @@ public function installTemplateSourceInstallsComposerPackage( $this->mockPackagesServerResponse($packages); - self::$io->setUserInputs([$constraint]); + $this->io->setUserInputs([$constraint]); $this->subject->installTemplateSource($templateSource); - self::assertStringContainsString($expected, self::$io->getOutput()); + self::assertStringContainsString($expected, $this->io->getOutput()); } #[Framework\Attributes\Test] @@ -402,8 +404,6 @@ function (array $carry, Package\PackageInterface $package) use ($dumper): array protected function tearDown(): void { - parent::tearDown(); - $this->server->stop(); } } diff --git a/tests/src/Template/Provider/ComposerProviderTest.php b/tests/src/Template/Provider/ComposerProviderTest.php index aac06dfc..993fd28e 100644 --- a/tests/src/Template/Provider/ComposerProviderTest.php +++ b/tests/src/Template/Provider/ComposerProviderTest.php @@ -44,9 +44,11 @@ final class ComposerProviderTest extends Tests\ContainerAwareTestCase protected function setUp(): void { + parent::setUp(); + $this->subject = new Src\Template\Provider\ComposerProvider( - self::$container->get('app.messenger'), - self::$container->get(Filesystem\Filesystem::class), + $this->container->get('app.messenger'), + $this->container->get(Filesystem\Filesystem::class), ); $this->server = new MockWebServer\MockWebServer(); $this->server->start(); @@ -59,9 +61,9 @@ public function requestCustomOptionsAsksAndAppliesBaseUrl(): void { $this->overwriteIO(); - self::$io->setUserInputs(['https://example.com']); + $this->io->setUserInputs(['https://example.com']); - $this->subject->requestCustomOptions(self::$container->get('app.messenger')); + $this->subject->requestCustomOptions($this->container->get('app.messenger')); self::assertSame('https://example.com', $this->subject->getUrl()); } @@ -96,7 +98,7 @@ public function listTemplateSourcesAddsAdditionalEmptyLineOnWrittenOutput(): voi $this->subject->listTemplateSources(); self::assertTrue($io->isOutputWritten()); - self::assertSame(PHP_EOL, self::$io->getOutput()); + self::assertSame(PHP_EOL, $this->io->getOutput()); } #[Framework\Attributes\Test] @@ -118,7 +120,7 @@ public function listTemplateSourcesConnectsToComposerHostToFetchAvailablePackage private function overwriteIO(): void { - $this->setPropertyValueOnObject($this->subject, 'io', self::$io); + $this->setPropertyValueOnObject($this->subject, 'io', $this->io); } private function acceptInsecureConnections(): void @@ -151,8 +153,6 @@ private function getReflectionProperty(object $object, string $propertyName): Re protected function tearDown(): void { - parent::tearDown(); - $this->server->stop(); } } diff --git a/tests/src/Template/Provider/ProviderFactoryTest.php b/tests/src/Template/Provider/ProviderFactoryTest.php index cfc81ec5..c52934f2 100644 --- a/tests/src/Template/Provider/ProviderFactoryTest.php +++ b/tests/src/Template/Provider/ProviderFactoryTest.php @@ -39,7 +39,9 @@ final class ProviderFactoryTest extends Tests\ContainerAwareTestCase protected function setUp(): void { - $this->subject = self::$container->get(Src\Template\Provider\ProviderFactory::class); + parent::setUp(); + + $this->subject = $this->container->get(Src\Template\Provider\ProviderFactory::class); } #[Framework\Attributes\Test] diff --git a/tests/src/Template/Provider/VcsProviderTest.php b/tests/src/Template/Provider/VcsProviderTest.php index d32571df..b16e7bbd 100644 --- a/tests/src/Template/Provider/VcsProviderTest.php +++ b/tests/src/Template/Provider/VcsProviderTest.php @@ -52,9 +52,11 @@ final class VcsProviderTest extends Tests\ContainerAwareTestCase protected function setUp(): void { - $this->filesystem = self::$container->get(Filesystem\Filesystem::class); + parent::setUp(); + + $this->filesystem = $this->container->get(Filesystem\Filesystem::class); $this->subject = new Src\Template\Provider\VcsProvider( - self::$container->get('app.messenger'), + $this->container->get('app.messenger'), $this->filesystem, ); $this->rootPath = Src\Helper\FilesystemHelper::getPackageDirectory(); @@ -65,9 +67,9 @@ protected function setUp(): void #[Framework\Attributes\Test] public function requestCustomOptionsAsksAndAppliesBaseUrl(): void { - self::$io->setUserInputs(['https://example.com']); + $this->io->setUserInputs(['https://example.com']); - $this->subject->requestCustomOptions(self::$container->get('app.messenger')); + $this->subject->requestCustomOptions($this->container->get('app.messenger')); self::assertSame('https://example.com', $this->subject->getUrl()); } @@ -101,14 +103,14 @@ public function listTemplateSourcesAddsAdditionalEmptyLineOnWrittenOutput(): voi new Console\Output\BufferedOutput(Console\Output\OutputInterface::VERBOSITY_VERY_VERBOSE), ); - self::$io->setUserInputs([$repoA]); + $this->io->setUserInputs([$repoA]); - $this->subject->requestCustomOptions(self::$container->get('app.messenger')); + $this->subject->requestCustomOptions($this->container->get('app.messenger')); $this->subject->listTemplateSources(); self::assertTrue($io->isOutputWritten()); - self::assertStringContainsString(PHP_EOL, self::$io->getOutput()); + self::assertStringContainsString(PHP_EOL, $this->io->getOutput()); $this->filesystem->remove($repoA); } @@ -120,9 +122,9 @@ public function listTemplateSourcesListsTemplatesFromConfiguredRepository(): voi $repoA = $this->initializeGitRepository('test/repo-a', ['test/repo-b' => '*']); - self::$io->setUserInputs([$repoA]); + $this->io->setUserInputs([$repoA]); - $this->subject->requestCustomOptions(self::$container->get('app.messenger')); + $this->subject->requestCustomOptions($this->container->get('app.messenger')); $actual = $this->subject->listTemplateSources(); @@ -144,9 +146,9 @@ public function listTemplateSourcesListsExcludedPackages(): void ], ]); - self::$io->setUserInputs([$repoA]); + $this->io->setUserInputs([$repoA]); - $this->subject->requestCustomOptions(self::$container->get('app.messenger')); + $this->subject->requestCustomOptions($this->container->get('app.messenger')); $expected = [ 'cpsit/project-builder' => [ @@ -170,7 +172,7 @@ public function installTemplateSourceAsksForAdditionalRepositories(): void $repoA = $this->initializeGitRepository('test/repo-a', ['test/repo-b' => '*']); $repoB = $this->initializeGitRepository('test/repo-b'); - self::$io->setUserInputs([ + $this->io->setUserInputs([ $repoA, '', 'yes', @@ -180,7 +182,7 @@ public function installTemplateSourceAsksForAdditionalRepositories(): void '', ]); - $this->subject->requestCustomOptions(self::$container->get('app.messenger')); + $this->subject->requestCustomOptions($this->container->get('app.messenger')); [$templateSource] = $this->subject->listTemplateSources(); @@ -192,7 +194,7 @@ public function installTemplateSourceAsksForAdditionalRepositories(): void self::assertDirectoryExists($this->rootPath.'/.build/templates/repo-a'); self::assertDirectoryExists($this->rootPath.'/.build/templates/repo-b'); - $output = self::$io->getOutput(); + $output = $this->io->getOutput(); $repositories = $this->fetchConfiguredRepositoriesViaReflection(); self::assertSame( @@ -213,7 +215,7 @@ public function installTemplateSourceAsksForAdditionalRepositories(): void private function overwriteIO(): void { - $this->setPropertyValueOnObject($this->subject, 'io', self::$io); + $this->setPropertyValueOnObject($this->subject, 'io', $this->io); } private function acceptInsecureConnections(): void @@ -270,7 +272,7 @@ private function initializeGitRepository(string $composerName, array $requiremen // Initialize repository self::executeInDirectory($repoDir, function (string $repoDir) use ($composerName, $requirements, $extra) { - $runner = self::$container->get(Cli\Command\Runner::class); + $runner = $this->container->get(Cli\Command\Runner::class); // Initialize repository $initCommand = (new Cli\Command\Executable('git')) diff --git a/tests/src/Twig/Filter/SlugifyFilterTest.php b/tests/src/Twig/Filter/SlugifyFilterTest.php index 72beef00..09f4b3b9 100644 --- a/tests/src/Twig/Filter/SlugifyFilterTest.php +++ b/tests/src/Twig/Filter/SlugifyFilterTest.php @@ -43,7 +43,9 @@ final class SlugifyFilterTest extends Tests\ContainerAwareTestCase protected function setUp(): void { - $this->subject = self::$container->get(Src\Twig\Filter\SlugifyFilter::class); + parent::setUp(); + + $this->subject = $this->container->get(Src\Twig\Filter\SlugifyFilter::class); error_reporting(E_WARNING); } diff --git a/tests/src/Twig/Func/NameVariantFunctionTest.php b/tests/src/Twig/Func/NameVariantFunctionTest.php index 0be69b9f..ab89a6bf 100644 --- a/tests/src/Twig/Func/NameVariantFunctionTest.php +++ b/tests/src/Twig/Func/NameVariantFunctionTest.php @@ -41,6 +41,8 @@ final class NameVariantFunctionTest extends Tests\ContainerAwareTestCase protected function setUp(): void { + parent::setUp(); + $this->subject = new Src\Twig\Func\NameVariantFunction(); } @@ -72,7 +74,7 @@ public function invokeThrowsExceptionIfGivenContextDoesNotContainBuildInstructio public function invokeReturnsNameVariant(string $variant, ?string $case, ?string $expected): void { $instructions = new Src\Builder\BuildInstructions( - self::$container->get('app.config'), + $this->container->get('app.config'), 'foo', ); $instructions->addTemplateVariable('project', [ diff --git a/tests/src/Twig/Func/PhpVersionFunctionTest.php b/tests/src/Twig/Func/PhpVersionFunctionTest.php index ccc29914..e4f71a00 100644 --- a/tests/src/Twig/Func/PhpVersionFunctionTest.php +++ b/tests/src/Twig/Func/PhpVersionFunctionTest.php @@ -40,7 +40,9 @@ final class PhpVersionFunctionTest extends Tests\ContainerAwareTestCase protected function setUp(): void { - $this->subject = self::$container->get(Src\Twig\Func\PhpVersionFunction::class); + parent::setUp(); + + $this->subject = $this->container->get(Src\Twig\Func\PhpVersionFunction::class); } #[Framework\Attributes\Test] @@ -55,24 +57,24 @@ public function invokeThrowsExceptionIfGivenBranchIsNull(): void #[Framework\Attributes\Test] public function invokeReturnsAndCachesLatestStableVersionOfGivenBranch(): void { - self::$mockHandler->append(self::createJsonResponse(['version' => '8.0.10'])); - self::$mockHandler->append(self::createJsonResponse(['version' => '8.1.4'])); + $this->mockHandler->append(self::createJsonResponse(['version' => '8.0.10'])); + $this->mockHandler->append(self::createJsonResponse(['version' => '8.1.4'])); - self::assertCount(2, self::$mockHandler); + self::assertCount(2, $this->mockHandler); $actual = ($this->subject)('8.0'); self::assertSame('8.0.10', $actual); - self::assertCount(1, self::$mockHandler); + self::assertCount(1, $this->mockHandler); $actual = ($this->subject)('8.0'); self::assertSame('8.0.10', $actual); - self::assertCount(1, self::$mockHandler); + self::assertCount(1, $this->mockHandler); $actual = ($this->subject)('8.1'); self::assertSame('8.1.4', $actual); - self::assertCount(0, self::$mockHandler); + self::assertCount(0, $this->mockHandler); } } diff --git a/tests/src/Twig/RendererTest.php b/tests/src/Twig/RendererTest.php index f0dd4a99..c15aa374 100644 --- a/tests/src/Twig/RendererTest.php +++ b/tests/src/Twig/RendererTest.php @@ -45,14 +45,16 @@ final class RendererTest extends Tests\ContainerAwareTestCase protected function setUp(): void { - $this->subject = self::$container->get(Src\Twig\Renderer::class) + parent::setUp(); + + $this->subject = $this->container->get(Src\Twig\Renderer::class) ->withRootPath(dirname(__DIR__, 2).'/templates') ; $this->instructions = new Src\Builder\BuildInstructions( - self::$container->get('app.config'), + $this->container->get('app.config'), 'foo', ); - $this->eventListener = self::$container->get(Tests\Fixtures\DummyTemplateRenderingEventListener::class); + $this->eventListener = $this->container->get(Tests\Fixtures\DummyTemplateRenderingEventListener::class); } #[Framework\Attributes\Test] @@ -145,8 +147,6 @@ public function canRenderReturnsChecksWhetherGivenTemplateCanBeRendered(): void protected function tearDown(): void { - parent::tearDown(); - $this->eventListener->dispatched = false; $this->eventListener->variables = []; } diff --git a/version-bumper.yaml b/version-bumper.yaml new file mode 100644 index 00000000..655f16bf --- /dev/null +++ b/version-bumper.yaml @@ -0,0 +1,6 @@ +filesToModify: + - path: docs/conf.py + patterns: + - release = "{%version%}" +releaseOptions: + commitMessage: '[RELEASE] Release of project-builder {%version%}'