From d200dbb648b13a9652b6e03d8ca9d8d650122bbb Mon Sep 17 00:00:00 2001 From: Aydin Hassan Date: Sat, 11 May 2024 10:34:52 +0200 Subject: [PATCH 01/27] Update PHP8 appreciate for new workshop version --- .docker/runtime/Dockerfile | 14 ++ .docker/runtime/docker-compose.yml | 14 ++ composer.json | 2 +- composer.lock | 137 +++++++++--------- src/Exercise/AMatchMadeInHeaven.php | 22 ++- src/Exercise/ASafeSpaceForNulls.php | 17 ++- src/Exercise/AllMixedUp.php | 24 +-- src/Exercise/CautionWithCatches.php | 22 ++- src/Exercise/HaveTheLastSay.php | 36 ++--- src/Exercise/InfiniteDivisions.php | 26 ++-- src/Exercise/LordOfTheStrings.php | 26 ++-- src/Exercise/PhpGetsAPromotion.php | 12 +- src/Exercise/StringifyToDemystify.php | 25 ++-- src/Exercise/TheAttributesOfSuccess.php | 50 ++++--- src/Exercise/TheReturnOfStatic.php | 16 +- src/Exercise/ThrowAnExpression.php | 22 +-- src/Exercise/UniteTheTypes.php | 14 +- test/Exercise/LordOfTheStringsTest.php | 2 +- .../lord-of-the-strings/solution-no-code.php | 1 - .../solution-no-composer.php | 3 + 20 files changed, 283 insertions(+), 202 deletions(-) create mode 100644 .docker/runtime/Dockerfile create mode 100644 .docker/runtime/docker-compose.yml delete mode 100644 test/solutions/lord-of-the-strings/solution-no-code.php create mode 100644 test/solutions/lord-of-the-strings/solution-no-composer.php diff --git a/.docker/runtime/Dockerfile b/.docker/runtime/Dockerfile new file mode 100644 index 0000000..dc8e93f --- /dev/null +++ b/.docker/runtime/Dockerfile @@ -0,0 +1,14 @@ +FROM php:8.3-alpine as build + +RUN apk add --no-cache $PHPIZE_DEPS && \ + apk add --no-cache linux-headers + +RUN docker-php-ext-install sockets + +FROM php:8.3-alpine as final + +COPY --from=build /usr/local/lib/php /usr/local/lib/php +COPY --from=build /usr/local/etc/php /usr/local/etc/php + +RUN apk add git +RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer \ No newline at end of file diff --git a/.docker/runtime/docker-compose.yml b/.docker/runtime/docker-compose.yml new file mode 100644 index 0000000..8ea2906 --- /dev/null +++ b/.docker/runtime/docker-compose.yml @@ -0,0 +1,14 @@ +version: '3.8' + +services: + runtime: + image: php8appreciate-runtime + build: + context: . + dockerfile: Dockerfile + + volumes: + - type: bind + source: ${SOLUTION} + target: '/solution' + diff --git a/composer.json b/composer.json index 7c702d9..3b2d862 100644 --- a/composer.json +++ b/composer.json @@ -22,7 +22,7 @@ ], "require": { "php": "^8.0", - "php-school/php-workshop": "dev-master" + "php-school/php-workshop": "dev-05-09-remove_temporary_solution_mapper" }, "require-dev": { "phpunit/phpunit": "^9", diff --git a/composer.lock b/composer.lock index 5f88a06..5405d1b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "861a3809372ea7552bbd417ed292aff9", + "content-hash": "7bd3b34dc505a0982f14fe5cf1e61f63", "packages": [ { "name": "beberlei/assert", @@ -734,21 +734,21 @@ }, { "name": "nikic/php-parser", - "version": "v4.18.0", + "version": "v4.19.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999" + "reference": "4e1b88d21c69391150ace211e9eaf05810858d0b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999", - "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4e1b88d21c69391150ace211e9eaf05810858d0b", + "reference": "4e1b88d21c69391150ace211e9eaf05810858d0b", "shasum": "" }, "require": { "ext-tokenizer": "*", - "php": ">=7.0" + "php": ">=7.1" }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", @@ -784,9 +784,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.1" }, - "time": "2023-12-10T21:03:43+00:00" + "time": "2024-03-17T08:10:35+00:00" }, { "name": "php-di/invoker", @@ -1126,16 +1126,16 @@ }, { "name": "php-school/php-workshop", - "version": "dev-master", + "version": "dev-05-09-remove_temporary_solution_mapper", "source": { "type": "git", "url": "https://github.com/php-school/php-workshop.git", - "reference": "11911b2157e80480a8cc272b56f417f5ba4903bf" + "reference": "30483511ef91935c41dadc588edb5d6b548041c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-school/php-workshop/zipball/11911b2157e80480a8cc272b56f417f5ba4903bf", - "reference": "11911b2157e80480a8cc272b56f417f5ba4903bf", + "url": "https://api.github.com/repos/php-school/php-workshop/zipball/30483511ef91935c41dadc588edb5d6b548041c5", + "reference": "30483511ef91935c41dadc588edb5d6b548041c5", "shasum": "" }, "require": { @@ -1165,7 +1165,6 @@ "squizlabs/php_codesniffer": "^3.7", "yoast/phpunit-polyfills": "^0.2.0" }, - "default-branch": true, "type": "library", "autoload": { "files": [ @@ -1204,9 +1203,9 @@ ], "support": { "issues": "https://github.com/php-school/php-workshop/issues", - "source": "https://github.com/php-school/php-workshop/tree/master" + "source": "https://github.com/php-school/php-workshop/tree/05-09-remove_temporary_solution_mapper" }, - "time": "2024-03-10T13:04:10+00:00" + "time": "2024-05-11T08:45:34+00:00" }, { "name": "php-school/terminal", @@ -1367,20 +1366,20 @@ }, { "name": "psr/http-factory", - "version": "1.0.2", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-factory.git", - "reference": "e616d01114759c4c489f93b099585439f795fe35" + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", - "reference": "e616d01114759c4c489f93b099585439f795fe35", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", "shasum": "" }, "require": { - "php": ">=7.0.0", + "php": ">=7.1", "psr/http-message": "^1.0 || ^2.0" }, "type": "library", @@ -1404,7 +1403,7 @@ "homepage": "https://www.php-fig.org/" } ], - "description": "Common interfaces for PSR-7 HTTP message factories", + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", "keywords": [ "factory", "http", @@ -1416,9 +1415,9 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-factory/tree/1.0.2" + "source": "https://github.com/php-fig/http-factory" }, - "time": "2023-04-10T20:10:41+00:00" + "time": "2024-04-15T12:06:14+00:00" }, { "name": "psr/http-message", @@ -1569,16 +1568,16 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v3.4.0", + "version": "v3.5.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", - "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", "shasum": "" }, "require": { @@ -1587,7 +1586,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "3.4-dev" + "dev-main": "3.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -1616,7 +1615,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.4.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" }, "funding": [ { @@ -1632,26 +1631,27 @@ "type": "tidelift" } ], - "time": "2023-05-23T14:45:45+00:00" + "time": "2024-04-18T09:32:20+00:00" }, { "name": "symfony/filesystem", - "version": "v6.4.3", + "version": "v6.4.7", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb" + "reference": "78dde75f8f6dbbca4ec436a4b0087f7af02076d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb", - "reference": "7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/78dde75f8f6dbbca4ec436a4b0087f7af02076d4", + "reference": "78dde75f8f6dbbca4ec436a4b0087f7af02076d4", "shasum": "" }, "require": { "php": ">=8.1", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8" + "symfony/polyfill-mbstring": "~1.8", + "symfony/process": "^5.4|^6.4" }, "type": "library", "autoload": { @@ -1679,7 +1679,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.3" + "source": "https://github.com/symfony/filesystem/tree/v6.4.7" }, "funding": [ { @@ -1695,7 +1695,7 @@ "type": "tidelift" } ], - "time": "2024-01-23T14:51:35+00:00" + "time": "2024-04-18T09:22:46+00:00" }, { "name": "symfony/polyfill-ctype", @@ -1858,16 +1858,16 @@ }, { "name": "symfony/process", - "version": "v6.4.4", + "version": "v6.4.7", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "710e27879e9be3395de2b98da3f52a946039f297" + "reference": "cdb1c81c145fd5aa9b0038bab694035020943381" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/710e27879e9be3395de2b98da3f52a946039f297", - "reference": "710e27879e9be3395de2b98da3f52a946039f297", + "url": "https://api.github.com/repos/symfony/process/zipball/cdb1c81c145fd5aa9b0038bab694035020943381", + "reference": "cdb1c81c145fd5aa9b0038bab694035020943381", "shasum": "" }, "require": { @@ -1899,7 +1899,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.4" + "source": "https://github.com/symfony/process/tree/v6.4.7" }, "funding": [ { @@ -1915,7 +1915,7 @@ "type": "tidelift" } ], - "time": "2024-02-20T12:31:00+00:00" + "time": "2024-04-18T09:22:46+00:00" } ], "packages-dev": [ @@ -2168,16 +2168,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.60", + "version": "1.10.67", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "95dcea7d6c628a3f2f56d091d8a0219485a86bbe" + "reference": "16ddbe776f10da6a95ebd25de7c1dbed397dc493" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/95dcea7d6c628a3f2f56d091d8a0219485a86bbe", - "reference": "95dcea7d6c628a3f2f56d091d8a0219485a86bbe", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/16ddbe776f10da6a95ebd25de7c1dbed397dc493", + "reference": "16ddbe776f10da6a95ebd25de7c1dbed397dc493", "shasum": "" }, "require": { @@ -2220,13 +2220,9 @@ { "url": "https://github.com/phpstan", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", - "type": "tidelift" } ], - "time": "2024-03-07T13:30:19+00:00" + "time": "2024-04-16T07:22:02+00:00" }, { "name": "phpunit/php-code-coverage", @@ -2549,16 +2545,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.17", + "version": "9.6.19", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "1a156980d78a6666721b7e8e8502fe210b587fcd" + "reference": "a1a54a473501ef4cdeaae4e06891674114d79db8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1a156980d78a6666721b7e8e8502fe210b587fcd", - "reference": "1a156980d78a6666721b7e8e8502fe210b587fcd", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a1a54a473501ef4cdeaae4e06891674114d79db8", + "reference": "a1a54a473501ef4cdeaae4e06891674114d79db8", "shasum": "" }, "require": { @@ -2632,7 +2628,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.17" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.19" }, "funding": [ { @@ -2648,7 +2644,7 @@ "type": "tidelift" } ], - "time": "2024-02-23T13:14:51+00:00" + "time": "2024-04-05T04:35:58+00:00" }, { "name": "sebastian/cli-parser", @@ -3452,16 +3448,16 @@ }, { "name": "sebastian/resource-operations", - "version": "3.0.3", + "version": "3.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", "shasum": "" }, "require": { @@ -3473,7 +3469,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -3494,8 +3490,7 @@ "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", "support": { - "issues": "https://github.com/sebastianbergmann/resource-operations/issues", - "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4" }, "funding": [ { @@ -3503,7 +3498,7 @@ "type": "github" } ], - "time": "2020-09-28T06:45:17+00:00" + "time": "2024-03-14T16:00:52+00:00" }, { "name": "sebastian/type", @@ -3616,16 +3611,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.9.0", + "version": "3.9.2", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "d63cee4890a8afaf86a22e51ad4d97c91dd4579b" + "reference": "aac1f6f347a5c5ac6bc98ad395007df00990f480" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/d63cee4890a8afaf86a22e51ad4d97c91dd4579b", - "reference": "d63cee4890a8afaf86a22e51ad4d97c91dd4579b", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/aac1f6f347a5c5ac6bc98ad395007df00990f480", + "reference": "aac1f6f347a5c5ac6bc98ad395007df00990f480", "shasum": "" }, "require": { @@ -3692,7 +3687,7 @@ "type": "open_collective" } ], - "time": "2024-02-16T15:06:51+00:00" + "time": "2024-04-23T20:25:34+00:00" }, { "name": "theseer/tokenizer", diff --git a/src/Exercise/AMatchMadeInHeaven.php b/src/Exercise/AMatchMadeInHeaven.php index e8fc17c..b6f7473 100644 --- a/src/Exercise/AMatchMadeInHeaven.php +++ b/src/Exercise/AMatchMadeInHeaven.php @@ -9,14 +9,14 @@ use PhpParser\NodeVisitorAbstract; use PhpParser\Parser; use PhpSchool\PhpWorkshop\Exercise\AbstractExercise; -use PhpSchool\PhpWorkshop\Exercise\BaseExerciseTrait; use PhpSchool\PhpWorkshop\Exercise\CliExercise; -use PhpSchool\PhpWorkshop\Exercise\DefaultExercise; -use PhpSchool\PhpWorkshop\Exercise\ExerciseAssets; use PhpSchool\PhpWorkshop\Exercise\ExerciseInterface; use PhpSchool\PhpWorkshop\Exercise\ExerciseType; use PhpSchool\PhpWorkshop\Exercise\ProvidesInitialCode; +use PhpSchool\PhpWorkshop\Exercise\Scenario\CliScenario; use PhpSchool\PhpWorkshop\ExerciseCheck\SelfCheck; +use PhpSchool\PhpWorkshop\ExerciseDispatcher; +use PhpSchool\PhpWorkshop\ExerciseRunner\Context\ExecutionContext; use PhpSchool\PhpWorkshop\Input\Input; use PhpSchool\PhpWorkshop\Result\Failure; use PhpSchool\PhpWorkshop\Result\ResultInterface; @@ -24,6 +24,8 @@ use PhpSchool\PhpWorkshop\Solution\SingleFileSolution; use PhpSchool\PhpWorkshop\Solution\SolutionInterface; +use function PhpSchool\PhpWorkshop\collect; + class AMatchMadeInHeaven extends AbstractExercise implements ExerciseInterface, CliExercise, @@ -44,8 +46,10 @@ public function getDescription(): string return 'PHP 8\'s Match Expression'; } - public function getArgs(): array + public function defineTestScenario(): CliScenario { + $environment = new CliScenario(); + $runs = [ ['enter'], ['esc'], @@ -55,7 +59,11 @@ public function getArgs(): array shuffle($runs); - return $runs; + foreach ($runs as $run) { + $environment->withExecution($run); + } + + return $environment; } public function getInitialCode(): SolutionInterface @@ -65,9 +73,9 @@ public function getInitialCode(): SolutionInterface ); } - public function check(Input $input): ResultInterface + public function check(ExecutionContext $context): ResultInterface { - $statements = $this->parser->parse((string) file_get_contents($input->getRequiredArgument('program'))); + $statements = $this->parser->parse((string) file_get_contents($context->getEntryPoint())); if (null === $statements || empty($statements)) { return Failure::fromNameAndReason($this->getName(), 'No code was found'); diff --git a/src/Exercise/ASafeSpaceForNulls.php b/src/Exercise/ASafeSpaceForNulls.php index e2b1434..d8887a8 100644 --- a/src/Exercise/ASafeSpaceForNulls.php +++ b/src/Exercise/ASafeSpaceForNulls.php @@ -17,15 +17,17 @@ use PhpParser\NodeFinder; use PhpParser\Parser; use PhpSchool\PhpWorkshop\Check\FileComparisonCheck; +use PhpSchool\PhpWorkshop\Environment\CliTestEnvironment; use PhpSchool\PhpWorkshop\Exercise\AbstractExercise; use PhpSchool\PhpWorkshop\Exercise\CliExercise; use PhpSchool\PhpWorkshop\Exercise\ExerciseInterface; use PhpSchool\PhpWorkshop\Exercise\ExerciseType; +use PhpSchool\PhpWorkshop\Exercise\Scenario\CliScenario; use PhpSchool\PhpWorkshop\Exercise\SubmissionPatchable; use PhpSchool\PhpWorkshop\ExerciseCheck\FileComparisonExerciseCheck; use PhpSchool\PhpWorkshop\ExerciseCheck\SelfCheck; use PhpSchool\PhpWorkshop\ExerciseDispatcher; -use PhpSchool\PhpWorkshop\Input\Input; +use PhpSchool\PhpWorkshop\ExerciseRunner\Context\ExecutionContext; use PhpSchool\PhpWorkshop\Patch; use PhpSchool\PhpWorkshop\Result\Failure; use PhpSchool\PhpWorkshop\Result\ResultInterface; @@ -59,14 +61,15 @@ public function getType(): ExerciseType return new ExerciseType(ExerciseType::CLI); } - public function getArgs(): array + public function getRequiredChecks(): array { - return []; + return [FileComparisonCheck::class]; } - public function configure(ExerciseDispatcher $dispatcher): void + public function defineTestScenario(): CliScenario { - $dispatcher->requireCheck(FileComparisonCheck::class); + return (new CliScenario()) + ->withExecution(); } public function getPatch(): Patch @@ -171,10 +174,10 @@ public function getPatch(): Patch }); } - public function check(Input $input): ResultInterface + public function check(ExecutionContext $context): ResultInterface { /** @var array $statements */ - $statements = $this->parser->parse((string) file_get_contents($input->getRequiredArgument('program'))); + $statements = $this->parser->parse((string) file_get_contents($context->getEntryPoint())); $ageFetch = $this->findNullSafePropFetch($statements, 'user', 'age'); $addressFetch = $this->findAllNullSafePropertyFetch($statements, 'user', 'address'); diff --git a/src/Exercise/AllMixedUp.php b/src/Exercise/AllMixedUp.php index c4cd217..d1bcfe8 100644 --- a/src/Exercise/AllMixedUp.php +++ b/src/Exercise/AllMixedUp.php @@ -14,15 +14,20 @@ use PhpParser\Parser; use PhpSchool\PhpWorkshop\Check\FileComparisonCheck; use PhpSchool\PhpWorkshop\Check\FunctionRequirementsCheck; +use PhpSchool\PhpWorkshop\Environment\CliTestEnvironment; use PhpSchool\PhpWorkshop\Exercise\AbstractExercise; use PhpSchool\PhpWorkshop\Exercise\CliExercise; use PhpSchool\PhpWorkshop\Exercise\ExerciseInterface; use PhpSchool\PhpWorkshop\Exercise\ExerciseType; +use PhpSchool\PhpWorkshop\Exercise\Scenario\CliScenario; use PhpSchool\PhpWorkshop\Exercise\SubmissionPatchable; use PhpSchool\PhpWorkshop\ExerciseCheck\FileComparisonExerciseCheck; use PhpSchool\PhpWorkshop\ExerciseCheck\FunctionRequirementsExerciseCheck; use PhpSchool\PhpWorkshop\ExerciseCheck\SelfCheck; use PhpSchool\PhpWorkshop\ExerciseDispatcher; +use PhpSchool\PhpWorkshop\ExerciseRunner\Context\CliContext; +use PhpSchool\PhpWorkshop\ExerciseRunner\Context\ExecutionContext; +use PhpSchool\PhpWorkshop\ExerciseRunner\Context\RunnerContext; use PhpSchool\PhpWorkshop\Input\Input; use PhpSchool\PhpWorkshop\Patch; use PhpSchool\PhpWorkshop\Result\Failure; @@ -58,15 +63,9 @@ public function getType(): ExerciseType return ExerciseType::CLI(); } - public function configure(ExerciseDispatcher $dispatcher): void + public function getRequiredChecks(): array { - $dispatcher->requireCheck(FunctionRequirementsCheck::class); - $dispatcher->requireCheck(FileComparisonCheck::class); - } - - public function getArgs(): array - { - return []; + return [FunctionRequirementsCheck::class, FileComparisonCheck::class]; } public function getPatch(): Patch @@ -134,10 +133,10 @@ public function getBannedFunctions(): array return []; } - public function check(Input $input): ResultInterface + public function check(ExecutionContext $context): ResultInterface { /** @var array $statements */ - $statements = $this->parser->parse((string) file_get_contents($input->getRequiredArgument('program'))); + $statements = $this->parser->parse((string) file_get_contents($context->getEntryPoint())); /** @var Function_|null $logger */ $logger = (new NodeFinder())->findFirst($statements, function (\PhpParser\Node $node) { @@ -170,4 +169,9 @@ public function check(Input $input): ResultInterface return new Success($this->getName()); } + + public function defineTestScenario(): CliScenario + { + return (new CliScenario())->withExecution(); + } } diff --git a/src/Exercise/CautionWithCatches.php b/src/Exercise/CautionWithCatches.php index 81efd45..ed1f8f0 100644 --- a/src/Exercise/CautionWithCatches.php +++ b/src/Exercise/CautionWithCatches.php @@ -10,12 +10,17 @@ use PhpParser\NodeFinder; use PhpParser\Parser; use PhpSchool\PhpWorkshop\CodeInsertion; +use PhpSchool\PhpWorkshop\Environment\CliTestEnvironment; use PhpSchool\PhpWorkshop\Exercise\AbstractExercise; use PhpSchool\PhpWorkshop\Exercise\CliExercise; use PhpSchool\PhpWorkshop\Exercise\ExerciseInterface; use PhpSchool\PhpWorkshop\Exercise\ExerciseType; +use PhpSchool\PhpWorkshop\Exercise\Scenario\CliScenario; use PhpSchool\PhpWorkshop\Exercise\SubmissionPatchable; use PhpSchool\PhpWorkshop\ExerciseCheck\SelfCheck; +use PhpSchool\PhpWorkshop\ExerciseDispatcher; +use PhpSchool\PhpWorkshop\ExerciseRunner\Context\CliContext; +use PhpSchool\PhpWorkshop\ExerciseRunner\Context\ExecutionContext; use PhpSchool\PhpWorkshop\Input\Input; use PhpSchool\PhpWorkshop\Patch; use PhpSchool\PhpWorkshop\Result\Failure; @@ -49,16 +54,10 @@ public function getType(): ExerciseType return ExerciseType::CLI(); } - public function getArgs(): array - { - $this->password = $this->faker->password(); - return [[$this->password]]; - } - - public function check(Input $input): ResultInterface + public function check(ExecutionContext $context): ResultInterface { /** @var array $statements */ - $statements = $this->parser->parse((string) file_get_contents($input->getRequiredArgument('program'))); + $statements = $this->parser->parse((string) file_get_contents($context->getEntryPoint())); /** @var TryCatch|null $tryCatch */ $tryCatch = (new NodeFinder())->findFirstInstanceOf($statements, TryCatch::class); @@ -87,4 +86,11 @@ function verify_password(string \$password) { return (new Patch())->withInsertion($passwordVerifyInsertion); } + + public function defineTestScenario(): CliScenario + { + $this->password = $this->faker->password(); + + return (new CliScenario())->withExecution([$this->password]); + } } diff --git a/src/Exercise/HaveTheLastSay.php b/src/Exercise/HaveTheLastSay.php index 42b5b31..94a7c6d 100644 --- a/src/Exercise/HaveTheLastSay.php +++ b/src/Exercise/HaveTheLastSay.php @@ -8,13 +8,19 @@ use PhpParser\NodeFinder; use PhpParser\Parser; use PhpSchool\PhpWorkshop\Check\FunctionRequirementsCheck; +use PhpSchool\PhpWorkshop\Environment\CliTestEnvironment; use PhpSchool\PhpWorkshop\Exercise\AbstractExercise; use PhpSchool\PhpWorkshop\Exercise\CliExercise; use PhpSchool\PhpWorkshop\Exercise\ExerciseInterface; use PhpSchool\PhpWorkshop\Exercise\ExerciseType; +use PhpSchool\PhpWorkshop\Exercise\Scenario\CliScenario; use PhpSchool\PhpWorkshop\Exercise\TemporaryDirectoryTrait; use PhpSchool\PhpWorkshop\ExerciseCheck\FunctionRequirementsExerciseCheck; use PhpSchool\PhpWorkshop\ExerciseCheck\SelfCheck; +use PhpSchool\PhpWorkshop\ExerciseDispatcher; +use PhpSchool\PhpWorkshop\ExerciseRunner\Context\CliContext; +use PhpSchool\PhpWorkshop\ExerciseRunner\Context\ExecutionContext; +use PhpSchool\PhpWorkshop\ExerciseRunner\Context\RunnerContext; use PhpSchool\PhpWorkshop\Input\Input; use PhpSchool\PhpWorkshop\Result\Failure; use PhpSchool\PhpWorkshop\Result\FailureInterface; @@ -45,10 +51,8 @@ public function getDescription(): string return 'Use named arguments to specify the last to a specific parameter'; } - public function getArgs(): array + public function defineTestScenario(): CliScenario { - $file = $this->getTemporaryPath(); - $countries = [ ['UK', 'London'], ['Austria', 'Vienna'], @@ -62,14 +66,15 @@ public function getArgs(): array ['Belarus', 'Minsk'], ]; - file_put_contents( - $file, - collect($this->getRandomCountries($countries))->map(fn ($row) => implode("|", $row))->implode("\n") - ); + $fileContent = collect($this->getRandomCountries($countries)) + ->map(fn ($row) => implode("|", $row)) + ->implode("\n"); - return [ - [$file] - ]; + $fileName = sprintf('countries-%s.csv', bin2hex(random_bytes(4))); + + return (new CliScenario()) + ->withExecution(["./$fileName"]) + ->withFile($fileName, $fileContent); } /** @@ -84,11 +89,6 @@ private function getRandomCountries(array $countries): array ); } - public function tearDown(): void - { - unlink($this->getTemporaryPath()); - } - public function getType(): ExerciseType { return ExerciseType::CLI(); @@ -104,16 +104,16 @@ public function getBannedFunctions(): array return []; } - public function check(Input $input): ResultInterface + public function check(ExecutionContext $context): ResultInterface { - $statements = $this->parser->parse((string) file_get_contents($input->getRequiredArgument('program'))); + $statements = $this->parser->parse((string) file_get_contents($context->getEntryPoint())); if (null === $statements || empty($statements)) { return Failure::fromNameAndReason($this->getName(), 'No code was found'); } $check = new FunctionRequirementsCheck($this->parser); - $result = $check->check($this, $input); + $result = $check->check($context); if ($result instanceof FailureInterface) { return $result; diff --git a/src/Exercise/InfiniteDivisions.php b/src/Exercise/InfiniteDivisions.php index 454c0c4..e0a64d6 100644 --- a/src/Exercise/InfiniteDivisions.php +++ b/src/Exercise/InfiniteDivisions.php @@ -12,13 +12,17 @@ use PhpParser\NodeFinder; use PhpParser\Parser; use PhpSchool\PhpWorkshop\Check\FunctionRequirementsCheck; +use PhpSchool\PhpWorkshop\Environment\CliTestEnvironment; use PhpSchool\PhpWorkshop\Exercise\AbstractExercise; use PhpSchool\PhpWorkshop\Exercise\CliExercise; use PhpSchool\PhpWorkshop\Exercise\ExerciseInterface; use PhpSchool\PhpWorkshop\Exercise\ExerciseType; +use PhpSchool\PhpWorkshop\Exercise\Scenario\CliScenario; use PhpSchool\PhpWorkshop\ExerciseCheck\FunctionRequirementsExerciseCheck; use PhpSchool\PhpWorkshop\ExerciseCheck\SelfCheck; use PhpSchool\PhpWorkshop\ExerciseDispatcher; +use PhpSchool\PhpWorkshop\ExerciseRunner\Context\ExecutionContext; +use PhpSchool\PhpWorkshop\ExerciseRunner\Context\RunnerContext; use PhpSchool\PhpWorkshop\Input\Input; use PhpSchool\PhpWorkshop\Result\Failure; use PhpSchool\PhpWorkshop\Result\ResultInterface; @@ -49,25 +53,25 @@ public function getType(): ExerciseType return ExerciseType::CLI(); } - public function configure(ExerciseDispatcher $dispatcher): void + public function getRequiredChecks(): array { - $dispatcher->requireCheck(FunctionRequirementsCheck::class); + return [FunctionRequirementsCheck::class]; } - public function getArgs(): array + public function defineTestScenario(): CliScenario { - return [ - [ + return (new CliScenario()) + ->withExecution([ (string) $this->faker->randomFloat(3, 10, 100), '0' - ], - [ + ]) + ->withExecution([ (string) $this->faker->randomFloat(3, 10, 100), (string) $this->faker->randomFloat(3, 0, 10) - ] - ]; + ]); } + public function getRequiredFunctions(): array { return ['fdiv', 'round']; @@ -78,10 +82,10 @@ public function getBannedFunctions(): array return []; } - public function check(Input $input): ResultInterface + public function check(ExecutionContext $context): ResultInterface { /** @var array $statements */ - $statements = $this->parser->parse((string) file_get_contents($input->getRequiredArgument('program'))); + $statements = $this->parser->parse((string) file_get_contents($context->getEntryPoint())); $finder = new NodeFinder(); diff --git a/src/Exercise/LordOfTheStrings.php b/src/Exercise/LordOfTheStrings.php index ea72642..1d70cd5 100644 --- a/src/Exercise/LordOfTheStrings.php +++ b/src/Exercise/LordOfTheStrings.php @@ -5,13 +5,17 @@ use Faker\Generator; use PhpSchool\PhpWorkshop\Check\ComposerCheck; use PhpSchool\PhpWorkshop\Check\FunctionRequirementsCheck; +use PhpSchool\PhpWorkshop\Environment\CliTestEnvironment; use PhpSchool\PhpWorkshop\Exercise\AbstractExercise; use PhpSchool\PhpWorkshop\Exercise\CliExercise; use PhpSchool\PhpWorkshop\Exercise\ExerciseInterface; use PhpSchool\PhpWorkshop\Exercise\ExerciseType; +use PhpSchool\PhpWorkshop\Exercise\Scenario\CliScenario; use PhpSchool\PhpWorkshop\ExerciseCheck\ComposerExerciseCheck; use PhpSchool\PhpWorkshop\ExerciseCheck\FunctionRequirementsExerciseCheck; use PhpSchool\PhpWorkshop\ExerciseDispatcher; +use PhpSchool\PhpWorkshop\ExerciseRunner\Context\CliContext; +use PhpSchool\PhpWorkshop\ExerciseRunner\Context\RunnerContext; use PhpSchool\PhpWorkshop\Solution\DirectorySolution; use PhpSchool\PhpWorkshop\Solution\SolutionInterface; @@ -40,18 +44,12 @@ public function getType(): ExerciseType return ExerciseType::CLI(); } - public function configure(ExerciseDispatcher $dispatcher): void + public function getRequiredChecks(): array { - $dispatcher->requireCheck(FunctionRequirementsCheck::class); - $dispatcher->requireCheck(ComposerCheck::class); + return [FunctionRequirementsCheck::class, ComposerCheck::class]; } - public function getSolution(): SolutionInterface - { - return DirectorySolution::fromDirectory(__DIR__ . '/../../exercises/lord-of-the-strings/solution'); - } - - public function getArgs(): array + public function defineTestScenario(): CliScenario { /** @var string $word */ $word = $this->faker->words(1, true); @@ -67,9 +65,13 @@ public function getArgs(): array 'nowhere' => $sentence }; - return [ - [$word, $sentence] - ]; + return (new CliScenario()) + ->withExecution([$word, $sentence]); + } + + public function getSolution(): SolutionInterface + { + return DirectorySolution::fromDirectory(__DIR__ . '/../../exercises/lord-of-the-strings/solution'); } public function insertWordInSentenceRandomly(string $word, string $sentence): string diff --git a/src/Exercise/PhpGetsAPromotion.php b/src/Exercise/PhpGetsAPromotion.php index d269028..a1c7c69 100644 --- a/src/Exercise/PhpGetsAPromotion.php +++ b/src/Exercise/PhpGetsAPromotion.php @@ -13,7 +13,9 @@ use PhpSchool\PhpWorkshop\Exercise\ExerciseInterface; use PhpSchool\PhpWorkshop\Exercise\ExerciseType; use PhpSchool\PhpWorkshop\Exercise\ProvidesInitialCode; +use PhpSchool\PhpWorkshop\Exercise\Scenario\CliScenario; use PhpSchool\PhpWorkshop\ExerciseCheck\SelfCheck; +use PhpSchool\PhpWorkshop\ExerciseRunner\Context\ExecutionContext; use PhpSchool\PhpWorkshop\Input\Input; use PhpSchool\PhpWorkshop\Result\Failure; use PhpSchool\PhpWorkshop\Result\ResultInterface; @@ -57,15 +59,15 @@ public function getType(): ExerciseType return ExerciseType::CLI(); } - public function getArgs(): array + public function defineTestScenario(): CliScenario { - return []; + return (new CliScenario())->withExecution(); } - public function check(Input $input): ResultInterface + public function check(ExecutionContext $context): ResultInterface { /** @var array $statements */ - $statements = $this->parser->parse((string) file_get_contents($input->getRequiredArgument('program'))); + $statements = $this->parser->parse((string) file_get_contents($context->getEntryPoint())); /** @var Class_|null $classNode */ $classNode = (new NodeFinder())->findFirstInstanceOf($statements, Class_::class); @@ -73,7 +75,7 @@ public function check(Input $input): ResultInterface return Failure::fromNameAndReason($this->getName(), 'No class was found'); } - (static fn () => require $input->getRequiredArgument('program'))(); + (static fn () => require $context->getEntryPoint())(); /** @var class-string $className */ $reflectionClass = new ReflectionClass($className); diff --git a/src/Exercise/StringifyToDemystify.php b/src/Exercise/StringifyToDemystify.php index bf84cf6..e419728 100644 --- a/src/Exercise/StringifyToDemystify.php +++ b/src/Exercise/StringifyToDemystify.php @@ -17,10 +17,12 @@ use PhpSchool\PhpWorkshop\Exercise\CgiExercise; use PhpSchool\PhpWorkshop\Exercise\ExerciseInterface; use PhpSchool\PhpWorkshop\Exercise\ExerciseType; +use PhpSchool\PhpWorkshop\Exercise\Scenario\CgiScenario; use PhpSchool\PhpWorkshop\Exercise\SubmissionPatchable; use PhpSchool\PhpWorkshop\ExerciseCheck\FunctionRequirementsExerciseCheck; use PhpSchool\PhpWorkshop\ExerciseCheck\SelfCheck; use PhpSchool\PhpWorkshop\ExerciseDispatcher; +use PhpSchool\PhpWorkshop\ExerciseRunner\Context\ExecutionContext; use PhpSchool\PhpWorkshop\Input\Input; use PhpSchool\PhpWorkshop\Patch; use PhpSchool\PhpWorkshop\Result\Failure; @@ -55,17 +57,16 @@ public function getType(): ExerciseType return ExerciseType::CGI(); } - public function configure(ExerciseDispatcher $dispatcher): void + public function getRequiredChecks(): array { - $dispatcher->requireCheck(FunctionRequirementsCheck::class); + return [FunctionRequirementsCheck::class]; } - /** - * @return array - */ - public function getRequests(): array + public function defineTestScenario(): CgiScenario { - return array_map( + $environment = new CgiScenario(); + + $requests = array_map( fn () => new Request( 'POST', 'https://phpschool.io/api', @@ -74,6 +75,12 @@ public function getRequests(): array ), array_fill(0, random_int(3, 6), null) ); + + foreach ($requests as $request) { + $environment->withExecution($request); + } + + return $environment; } /** @@ -132,10 +139,10 @@ public function getBannedFunctions(): array return []; } - public function check(Input $input): ResultInterface + public function check(ExecutionContext $context): ResultInterface { /** @var Stmt[] $statements */ - $statements = $this->parser->parse((string) file_get_contents($input->getRequiredArgument('program'))); + $statements = $this->parser->parse((string) file_get_contents($context->getEntryPoint())); /** @var Class_|null $classStmt */ $classStmt = (new NodeFinder())->findFirstInstanceOf($statements, Class_::class); diff --git a/src/Exercise/TheAttributesOfSuccess.php b/src/Exercise/TheAttributesOfSuccess.php index 934f4f7..fde0079 100644 --- a/src/Exercise/TheAttributesOfSuccess.php +++ b/src/Exercise/TheAttributesOfSuccess.php @@ -18,15 +18,18 @@ use PhpParser\Parser; use PhpSchool\PhpWorkshop\Check\FileComparisonCheck; use PhpSchool\PhpWorkshop\Check\FunctionRequirementsCheck; +use PhpSchool\PhpWorkshop\Environment\CliTestEnvironment; use PhpSchool\PhpWorkshop\Exercise\AbstractExercise; use PhpSchool\PhpWorkshop\Exercise\CliExercise; use PhpSchool\PhpWorkshop\Exercise\ExerciseInterface; use PhpSchool\PhpWorkshop\Exercise\ExerciseType; use PhpSchool\PhpWorkshop\Exercise\ProvidesInitialCode; +use PhpSchool\PhpWorkshop\Exercise\Scenario\CliScenario; use PhpSchool\PhpWorkshop\ExerciseCheck\FileComparisonExerciseCheck; use PhpSchool\PhpWorkshop\ExerciseCheck\FunctionRequirementsExerciseCheck; use PhpSchool\PhpWorkshop\ExerciseCheck\SelfCheck; use PhpSchool\PhpWorkshop\ExerciseDispatcher; +use PhpSchool\PhpWorkshop\ExerciseRunner\Context\ExecutionContext; use PhpSchool\PhpWorkshop\Input\Input; use PhpSchool\PhpWorkshop\Result\Failure; use PhpSchool\PhpWorkshop\Result\ResultInterface; @@ -57,10 +60,29 @@ public function getDescription(): string return 'PHP 8\'s Attributes'; } - public function configure(ExerciseDispatcher $dispatcher): void + public function getRequiredChecks(): array { - $dispatcher->requireCheck(FileComparisonCheck::class); - $dispatcher->requireCheck(FunctionRequirementsCheck::class); + return [ + FileComparisonCheck::class, + FunctionRequirementsCheck::class + ]; + } + + public function defineTestScenario(): CliScenario + { + return (new CliScenario()) + ->withExecution([ + json_encode( + [ + 'id' => random_int(0, 100), + 'comment' => $this->faker->sentence(4), + 'rating' => $this->faker->numberBetween(0, 5), + 'reviewer' => $this->faker->userName(), + 'date' => $this->faker->date('d-m-Y') + ], + JSON_THROW_ON_ERROR + ) + ]); } public function getInitialCode(): SolutionInterface @@ -83,28 +105,10 @@ public function getType(): ExerciseType return ExerciseType::CLI(); } - public function getArgs(): array - { - return [ - [ - json_encode( - [ - 'id' => random_int(0, 100), - 'comment' => $this->faker->sentence(4), - 'rating' => $this->faker->numberBetween(0, 5), - 'reviewer' => $this->faker->userName(), - 'date' => $this->faker->date('d-m-Y') - ], - JSON_THROW_ON_ERROR - ) - ] - ]; - } - - public function check(Input $input): ResultInterface + public function check(ExecutionContext $context): ResultInterface { /** @var array $statements */ - $statements = $this->parser->parse((string) file_get_contents($input->getRequiredArgument('program'))); + $statements = $this->parser->parse((string) file_get_contents($context->getEntryPoint())); /** @var Class_|null $classStmt */ $classStmt = (new NodeFinder())->findFirst($statements, function (Node $node) { diff --git a/src/Exercise/TheReturnOfStatic.php b/src/Exercise/TheReturnOfStatic.php index ab9d8b6..106fe61 100644 --- a/src/Exercise/TheReturnOfStatic.php +++ b/src/Exercise/TheReturnOfStatic.php @@ -12,12 +12,19 @@ use PhpParser\Node\Stmt\Function_; use PhpParser\NodeFinder; use PhpParser\Parser; +use PhpSchool\PhpWorkshop\Check\FileComparisonCheck; +use PhpSchool\PhpWorkshop\Check\FunctionRequirementsCheck; +use PhpSchool\PhpWorkshop\Environment\CliTestEnvironment; use PhpSchool\PhpWorkshop\Exercise\AbstractExercise; use PhpSchool\PhpWorkshop\Exercise\CliExercise; use PhpSchool\PhpWorkshop\Exercise\ExerciseInterface; use PhpSchool\PhpWorkshop\Exercise\ExerciseType; use PhpSchool\PhpWorkshop\Exercise\ProvidesInitialCode; +use PhpSchool\PhpWorkshop\Exercise\Scenario\CliScenario; use PhpSchool\PhpWorkshop\ExerciseCheck\SelfCheck; +use PhpSchool\PhpWorkshop\ExerciseDispatcher; +use PhpSchool\PhpWorkshop\ExerciseRunner\Context\CliContext; +use PhpSchool\PhpWorkshop\ExerciseRunner\Context\ExecutionContext; use PhpSchool\PhpWorkshop\Input\Input; use PhpSchool\PhpWorkshop\Result\Failure; use PhpSchool\PhpWorkshop\Result\ResultInterface; @@ -57,15 +64,16 @@ public function getType(): ExerciseType return ExerciseType::CLI(); } - public function getArgs(): array + public function defineTestScenario(): CliScenario { - return []; + return (new CliScenario()) + ->withExecution([]); } - public function check(Input $input): ResultInterface + public function check(ExecutionContext $context): ResultInterface { /** @var array $statements */ - $statements = $this->parser->parse((string) file_get_contents($input->getRequiredArgument('program'))); + $statements = $this->parser->parse((string) file_get_contents($context->getEntryPoint())); $finder = new NodeFinder(); diff --git a/src/Exercise/ThrowAnExpression.php b/src/Exercise/ThrowAnExpression.php index 0848a21..7b0caa3 100644 --- a/src/Exercise/ThrowAnExpression.php +++ b/src/Exercise/ThrowAnExpression.php @@ -10,13 +10,16 @@ use PhpParser\Node\Stmt\If_; use PhpParser\NodeFinder; use PhpParser\Parser; +use PhpSchool\PhpWorkshop\Environment\CgiTestEnvironment; use PhpSchool\PhpWorkshop\Exercise\AbstractExercise; use PhpSchool\PhpWorkshop\Exercise\CgiExercise; use PhpSchool\PhpWorkshop\Exercise\ExerciseInterface; use PhpSchool\PhpWorkshop\Exercise\ExerciseType; use PhpSchool\PhpWorkshop\Exercise\ProvidesInitialCode; +use PhpSchool\PhpWorkshop\Exercise\Scenario\CgiScenario; use PhpSchool\PhpWorkshop\Exercise\SubmissionPatchable; use PhpSchool\PhpWorkshop\ExerciseCheck\SelfCheck; +use PhpSchool\PhpWorkshop\ExerciseRunner\Context\ExecutionContext; use PhpSchool\PhpWorkshop\Input\Input; use PhpSchool\PhpWorkshop\Patch; use PhpSchool\PhpWorkshop\Result\Failure; @@ -51,18 +54,10 @@ public function getType(): ExerciseType return ExerciseType::CGI(); } - public function getRequests(): array - { - return [ - (new Request('GET', 'https://top-secret.com/forbidden')), - (new Request('GET', 'https://top-secret.com/blog')) - ]; - } - - public function check(Input $input): ResultInterface + public function check(ExecutionContext $context): ResultInterface { /** @var array $statements */ - $statements = $this->parser->parse((string) file_get_contents($input->getRequiredArgument('program'))); + $statements = $this->parser->parse((string) file_get_contents($context->getEntryPoint())); /** @var If_|null $if */ $if = (new NodeFinder())->findFirstInstanceOf($statements, If_::class); @@ -97,4 +92,11 @@ public function getPatch(): Patch return (new Patch()) ->withTransformer(new Patch\WrapInTryCatch(\InvalidArgumentException::class)); } + + public function defineTestScenario(): CgiScenario + { + return (new CgiScenario()) + ->withExecution(new Request('GET', 'https://top-secret.com/forbidden')) + ->withExecution(new Request('GET', 'https://top-secret.com/blog')); + } } diff --git a/src/Exercise/UniteTheTypes.php b/src/Exercise/UniteTheTypes.php index 0d7db46..beb1531 100644 --- a/src/Exercise/UniteTheTypes.php +++ b/src/Exercise/UniteTheTypes.php @@ -9,12 +9,17 @@ use PhpParser\NodeFinder; use PhpParser\Parser; use PhpSchool\PhpWorkshop\CodeInsertion; +use PhpSchool\PhpWorkshop\Environment\CliTestEnvironment; use PhpSchool\PhpWorkshop\Exercise\AbstractExercise; use PhpSchool\PhpWorkshop\Exercise\CliExercise; use PhpSchool\PhpWorkshop\Exercise\ExerciseInterface; use PhpSchool\PhpWorkshop\Exercise\ExerciseType; +use PhpSchool\PhpWorkshop\Exercise\Scenario\CliScenario; use PhpSchool\PhpWorkshop\Exercise\SubmissionPatchable; use PhpSchool\PhpWorkshop\ExerciseCheck\SelfCheck; +use PhpSchool\PhpWorkshop\ExerciseDispatcher; +use PhpSchool\PhpWorkshop\ExerciseRunner\Context\CliContext; +use PhpSchool\PhpWorkshop\ExerciseRunner\Context\ExecutionContext; use PhpSchool\PhpWorkshop\Input\Input; use PhpSchool\PhpWorkshop\Patch; use PhpSchool\PhpWorkshop\Result\Failure; @@ -47,7 +52,7 @@ public function getType(): ExerciseType return ExerciseType::CLI(); } - public function getArgs(): array + public function defineTestScenario(): CliScenario { $numbers = array_map( function (): string { @@ -59,7 +64,8 @@ function (): string { range(0, random_int(5, 15)) ); - return [$numbers]; + return (new CliScenario()) + ->withExecution($numbers); } public function getPatch(): Patch @@ -82,10 +88,10 @@ public function getPatch(): Patch ->withInsertion($casterInsertion); } - public function check(Input $input): ResultInterface + public function check(ExecutionContext $context): ResultInterface { /** @var array $statements */ - $statements = $this->parser->parse((string) file_get_contents($input->getRequiredArgument('program'))); + $statements = $this->parser->parse((string) file_get_contents($context->getEntryPoint())); /** @var Function_|null $adder */ $adder = (new NodeFinder())->findFirst($statements, function (\PhpParser\Node $node) { diff --git a/test/Exercise/LordOfTheStringsTest.php b/test/Exercise/LordOfTheStringsTest.php index e4d671c..2cc9f62 100644 --- a/test/Exercise/LordOfTheStringsTest.php +++ b/test/Exercise/LordOfTheStringsTest.php @@ -23,7 +23,7 @@ public function getExerciseClass(): string public function testWithNoComposerFile(): void { - $this->runExercise('solution-no-code.php'); + $this->runExercise('solution-no-composer.php'); $this->assertVerifyWasNotSuccessful(); $this->assertResultsHasFailureAndMatches(ComposerFailure::class, function (ComposerFailure $composerFailure) { diff --git a/test/solutions/lord-of-the-strings/solution-no-code.php b/test/solutions/lord-of-the-strings/solution-no-code.php deleted file mode 100644 index b3d9bbc..0000000 --- a/test/solutions/lord-of-the-strings/solution-no-code.php +++ /dev/null @@ -1 +0,0 @@ - Date: Fri, 17 May 2024 08:52:43 +0200 Subject: [PATCH 02/27] Update branch --- composer.json | 2 +- composer.lock | 33 ++++++++++++++++++++------------- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/composer.json b/composer.json index 3b2d862..7c702d9 100644 --- a/composer.json +++ b/composer.json @@ -22,7 +22,7 @@ ], "require": { "php": "^8.0", - "php-school/php-workshop": "dev-05-09-remove_temporary_solution_mapper" + "php-school/php-workshop": "dev-master" }, "require-dev": { "phpunit/phpunit": "^9", diff --git a/composer.lock b/composer.lock index 5405d1b..052a41b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "7bd3b34dc505a0982f14fe5cf1e61f63", + "content-hash": "861a3809372ea7552bbd417ed292aff9", "packages": [ { "name": "beberlei/assert", @@ -1126,16 +1126,16 @@ }, { "name": "php-school/php-workshop", - "version": "dev-05-09-remove_temporary_solution_mapper", + "version": "dev-master", "source": { "type": "git", "url": "https://github.com/php-school/php-workshop.git", - "reference": "30483511ef91935c41dadc588edb5d6b548041c5" + "reference": "ce202fb47f81c344c18b5ce7006a474ed7862702" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-school/php-workshop/zipball/30483511ef91935c41dadc588edb5d6b548041c5", - "reference": "30483511ef91935c41dadc588edb5d6b548041c5", + "url": "https://api.github.com/repos/php-school/php-workshop/zipball/ce202fb47f81c344c18b5ce7006a474ed7862702", + "reference": "ce202fb47f81c344c18b5ce7006a474ed7862702", "shasum": "" }, "require": { @@ -1158,14 +1158,21 @@ "symfony/process": "^4.0 | ^5.0 | ^6.0" }, "require-dev": { + "bamarni/composer-bin-plugin": "^1.8", "composer/composer": "^2.0", "phpstan/extension-installer": "^1.0", "phpstan/phpstan": "^1.8", "phpunit/phpunit": "^8.5", - "squizlabs/php_codesniffer": "^3.7", "yoast/phpunit-polyfills": "^0.2.0" }, + "default-branch": true, "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, "autoload": { "files": [ "src/Event/functions.php", @@ -1203,9 +1210,9 @@ ], "support": { "issues": "https://github.com/php-school/php-workshop/issues", - "source": "https://github.com/php-school/php-workshop/tree/05-09-remove_temporary_solution_mapper" + "source": "https://github.com/php-school/php-workshop/tree/master" }, - "time": "2024-05-11T08:45:34+00:00" + "time": "2024-05-17T19:12:46+00:00" }, { "name": "php-school/terminal", @@ -2168,16 +2175,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.67", + "version": "1.11.1", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "16ddbe776f10da6a95ebd25de7c1dbed397dc493" + "reference": "e524358f930e41a2b4cca1320e3b04fc26b39e0b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/16ddbe776f10da6a95ebd25de7c1dbed397dc493", - "reference": "16ddbe776f10da6a95ebd25de7c1dbed397dc493", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e524358f930e41a2b4cca1320e3b04fc26b39e0b", + "reference": "e524358f930e41a2b4cca1320e3b04fc26b39e0b", "shasum": "" }, "require": { @@ -2222,7 +2229,7 @@ "type": "github" } ], - "time": "2024-04-16T07:22:02+00:00" + "time": "2024-05-15T08:00:59+00:00" }, { "name": "phpunit/php-code-coverage", From 2da5ce28c54497b6e36247952334d6f93b386068 Mon Sep 17 00:00:00 2001 From: Aydin Hassan Date: Fri, 17 May 2024 22:52:28 +0200 Subject: [PATCH 03/27] Run with docker process factory --- .docker/runtime/docker-compose.yml | 2 -- composer.json | 2 +- composer.lock | 15 +++++++-------- phpunit.xml | 3 +++ src/Exercise/ThrowAnExpression.php | 1 - test/Exercise/ThrowAnExpressionTest.php | 2 +- 6 files changed, 12 insertions(+), 13 deletions(-) diff --git a/.docker/runtime/docker-compose.yml b/.docker/runtime/docker-compose.yml index 8ea2906..4d1bf84 100644 --- a/.docker/runtime/docker-compose.yml +++ b/.docker/runtime/docker-compose.yml @@ -1,5 +1,3 @@ -version: '3.8' - services: runtime: image: php8appreciate-runtime diff --git a/composer.json b/composer.json index 7c702d9..5fd1fb9 100644 --- a/composer.json +++ b/composer.json @@ -22,7 +22,7 @@ ], "require": { "php": "^8.0", - "php-school/php-workshop": "dev-master" + "php-school/php-workshop": "dev-docker-fixes" }, "require-dev": { "phpunit/phpunit": "^9", diff --git a/composer.lock b/composer.lock index 052a41b..5594cd8 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "861a3809372ea7552bbd417ed292aff9", + "content-hash": "eb93dbc5c18a5f711fbb75865235d490", "packages": [ { "name": "beberlei/assert", @@ -1126,16 +1126,16 @@ }, { "name": "php-school/php-workshop", - "version": "dev-master", + "version": "dev-configurable-process-factory", "source": { "type": "git", "url": "https://github.com/php-school/php-workshop.git", - "reference": "ce202fb47f81c344c18b5ce7006a474ed7862702" + "reference": "65049c5091e346413b645b04f408c953143747c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-school/php-workshop/zipball/ce202fb47f81c344c18b5ce7006a474ed7862702", - "reference": "ce202fb47f81c344c18b5ce7006a474ed7862702", + "url": "https://api.github.com/repos/php-school/php-workshop/zipball/65049c5091e346413b645b04f408c953143747c6", + "reference": "65049c5091e346413b645b04f408c953143747c6", "shasum": "" }, "require": { @@ -1165,7 +1165,6 @@ "phpunit/phpunit": "^8.5", "yoast/phpunit-polyfills": "^0.2.0" }, - "default-branch": true, "type": "library", "extra": { "bamarni-bin": { @@ -1210,9 +1209,9 @@ ], "support": { "issues": "https://github.com/php-school/php-workshop/issues", - "source": "https://github.com/php-school/php-workshop/tree/master" + "source": "https://github.com/php-school/php-workshop/tree/configurable-process-factory" }, - "time": "2024-05-17T19:12:46+00:00" + "time": "2024-05-17T19:27:26+00:00" }, { "name": "php-school/terminal", diff --git a/phpunit.xml b/phpunit.xml index 5200ada..dbf5daa 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -9,4 +9,7 @@ ./test ./test/solutions + + + diff --git a/src/Exercise/ThrowAnExpression.php b/src/Exercise/ThrowAnExpression.php index 7b0caa3..d5950ce 100644 --- a/src/Exercise/ThrowAnExpression.php +++ b/src/Exercise/ThrowAnExpression.php @@ -10,7 +10,6 @@ use PhpParser\Node\Stmt\If_; use PhpParser\NodeFinder; use PhpParser\Parser; -use PhpSchool\PhpWorkshop\Environment\CgiTestEnvironment; use PhpSchool\PhpWorkshop\Exercise\AbstractExercise; use PhpSchool\PhpWorkshop\Exercise\CgiExercise; use PhpSchool\PhpWorkshop\Exercise\ExerciseInterface; diff --git a/test/Exercise/ThrowAnExpressionTest.php b/test/Exercise/ThrowAnExpressionTest.php index 03d0666..efbd979 100644 --- a/test/Exercise/ThrowAnExpressionTest.php +++ b/test/Exercise/ThrowAnExpressionTest.php @@ -34,7 +34,7 @@ public function testThrowingWrongException(): void self::assertInstanceOf(Success::class, $output->getResults()[1]); self::assertMatchesRegularExpression( - '/Fatal error: Uncaught Exception: Access denied!/', + '/Fatal error: Uncaught Exception: Access denied!/', $output->getResults()[0]->getReason() ); From dac57b973c821ae5004f809b851a1b1db404b778 Mon Sep 17 00:00:00 2001 From: Aydin Hassan Date: Wed, 22 May 2024 22:58:06 +0200 Subject: [PATCH 04/27] Prime docker image --- .github/workflows/build.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5b09072..35ce855 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -30,6 +30,9 @@ jobs: - name: Install Dependencies run: composer update + - name: Build docker image + run: docker compose -p phpunit -f .docker/runtime/docker-compose.yml build + - name: Run phpunit tests run: | mkdir -p build/logs From 397bcbed0208f684d5b7152fbef891f1a6d16b28 Mon Sep 17 00:00:00 2001 From: Aydin Hassan Date: Sat, 25 May 2024 13:44:10 +0200 Subject: [PATCH 05/27] Try fix --- .docker/runtime/docker-compose.yml | 2 ++ .github/workflows/build.yml | 3 --- composer.lock | 34 +++++++++++++++--------------- src/Exercise/LordOfTheStrings.php | 3 --- 4 files changed, 19 insertions(+), 23 deletions(-) diff --git a/.docker/runtime/docker-compose.yml b/.docker/runtime/docker-compose.yml index 4d1bf84..b38f58a 100644 --- a/.docker/runtime/docker-compose.yml +++ b/.docker/runtime/docker-compose.yml @@ -5,6 +5,8 @@ services: context: . dockerfile: Dockerfile + user: ${UID}:${GID} + volumes: - type: bind source: ${SOLUTION} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 35ce855..5b09072 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -30,9 +30,6 @@ jobs: - name: Install Dependencies run: composer update - - name: Build docker image - run: docker compose -p phpunit -f .docker/runtime/docker-compose.yml build - - name: Run phpunit tests run: | mkdir -p build/logs diff --git a/composer.lock b/composer.lock index 5594cd8..7dcc4b9 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "eb93dbc5c18a5f711fbb75865235d490", + "content-hash": "2d8b0aef87879a02fc704a8f524de907", "packages": [ { "name": "beberlei/assert", @@ -1126,16 +1126,16 @@ }, { "name": "php-school/php-workshop", - "version": "dev-configurable-process-factory", + "version": "dev-docker-fixes", "source": { "type": "git", "url": "https://github.com/php-school/php-workshop.git", - "reference": "65049c5091e346413b645b04f408c953143747c6" + "reference": "86979bef6c82f5b835dc8a2906417a8c9d66b7c3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-school/php-workshop/zipball/65049c5091e346413b645b04f408c953143747c6", - "reference": "65049c5091e346413b645b04f408c953143747c6", + "url": "https://api.github.com/repos/php-school/php-workshop/zipball/86979bef6c82f5b835dc8a2906417a8c9d66b7c3", + "reference": "86979bef6c82f5b835dc8a2906417a8c9d66b7c3", "shasum": "" }, "require": { @@ -1209,9 +1209,9 @@ ], "support": { "issues": "https://github.com/php-school/php-workshop/issues", - "source": "https://github.com/php-school/php-workshop/tree/configurable-process-factory" + "source": "https://github.com/php-school/php-workshop/tree/docker-fixes" }, - "time": "2024-05-17T19:27:26+00:00" + "time": "2024-05-25T12:02:59+00:00" }, { "name": "php-school/terminal", @@ -2174,16 +2174,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.11.1", + "version": "1.11.2", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "e524358f930e41a2b4cca1320e3b04fc26b39e0b" + "reference": "0d5d4294a70deb7547db655c47685d680e39cfec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e524358f930e41a2b4cca1320e3b04fc26b39e0b", - "reference": "e524358f930e41a2b4cca1320e3b04fc26b39e0b", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/0d5d4294a70deb7547db655c47685d680e39cfec", + "reference": "0d5d4294a70deb7547db655c47685d680e39cfec", "shasum": "" }, "require": { @@ -2228,7 +2228,7 @@ "type": "github" } ], - "time": "2024-05-15T08:00:59+00:00" + "time": "2024-05-24T13:23:04+00:00" }, { "name": "phpunit/php-code-coverage", @@ -3617,16 +3617,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.9.2", + "version": "3.10.1", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "aac1f6f347a5c5ac6bc98ad395007df00990f480" + "reference": "8f90f7a53ce271935282967f53d0894f8f1ff877" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/aac1f6f347a5c5ac6bc98ad395007df00990f480", - "reference": "aac1f6f347a5c5ac6bc98ad395007df00990f480", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/8f90f7a53ce271935282967f53d0894f8f1ff877", + "reference": "8f90f7a53ce271935282967f53d0894f8f1ff877", "shasum": "" }, "require": { @@ -3693,7 +3693,7 @@ "type": "open_collective" } ], - "time": "2024-04-23T20:25:34+00:00" + "time": "2024-05-22T21:24:41+00:00" }, { "name": "theseer/tokenizer", diff --git a/src/Exercise/LordOfTheStrings.php b/src/Exercise/LordOfTheStrings.php index 1d70cd5..a970347 100644 --- a/src/Exercise/LordOfTheStrings.php +++ b/src/Exercise/LordOfTheStrings.php @@ -5,7 +5,6 @@ use Faker\Generator; use PhpSchool\PhpWorkshop\Check\ComposerCheck; use PhpSchool\PhpWorkshop\Check\FunctionRequirementsCheck; -use PhpSchool\PhpWorkshop\Environment\CliTestEnvironment; use PhpSchool\PhpWorkshop\Exercise\AbstractExercise; use PhpSchool\PhpWorkshop\Exercise\CliExercise; use PhpSchool\PhpWorkshop\Exercise\ExerciseInterface; @@ -14,8 +13,6 @@ use PhpSchool\PhpWorkshop\ExerciseCheck\ComposerExerciseCheck; use PhpSchool\PhpWorkshop\ExerciseCheck\FunctionRequirementsExerciseCheck; use PhpSchool\PhpWorkshop\ExerciseDispatcher; -use PhpSchool\PhpWorkshop\ExerciseRunner\Context\CliContext; -use PhpSchool\PhpWorkshop\ExerciseRunner\Context\RunnerContext; use PhpSchool\PhpWorkshop\Solution\DirectorySolution; use PhpSchool\PhpWorkshop\Solution\SolutionInterface; From 1dc4d4a1c7e14c4ec0686a9ea52238e696cbcfe2 Mon Sep 17 00:00:00 2001 From: Aydin Hassan Date: Sat, 25 May 2024 15:46:58 +0200 Subject: [PATCH 06/27] Remove unneccessary cleanup --- composer.lock | 8 ++--- src/Exercise/ASafeSpaceForNulls.php | 2 -- test/Exercise/ASafeSpaceForNullsTest.php | 38 +++++++++----------- test/Exercise/AllMixedUpTest.php | 6 ---- test/Exercise/LordOfTheStringsTest.php | 6 ++-- test/Exercise/TheAttributesOfSuccessTest.php | 36 +++++++++---------- 6 files changed, 42 insertions(+), 54 deletions(-) diff --git a/composer.lock b/composer.lock index 7dcc4b9..23a2645 100644 --- a/composer.lock +++ b/composer.lock @@ -1130,12 +1130,12 @@ "source": { "type": "git", "url": "https://github.com/php-school/php-workshop.git", - "reference": "86979bef6c82f5b835dc8a2906417a8c9d66b7c3" + "reference": "0790024a850786bfcbcefe7873da37bcc7b8e22d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-school/php-workshop/zipball/86979bef6c82f5b835dc8a2906417a8c9d66b7c3", - "reference": "86979bef6c82f5b835dc8a2906417a8c9d66b7c3", + "url": "https://api.github.com/repos/php-school/php-workshop/zipball/0790024a850786bfcbcefe7873da37bcc7b8e22d", + "reference": "0790024a850786bfcbcefe7873da37bcc7b8e22d", "shasum": "" }, "require": { @@ -1211,7 +1211,7 @@ "issues": "https://github.com/php-school/php-workshop/issues", "source": "https://github.com/php-school/php-workshop/tree/docker-fixes" }, - "time": "2024-05-25T12:02:59+00:00" + "time": "2024-05-25T13:44:46+00:00" }, { "name": "php-school/terminal", diff --git a/src/Exercise/ASafeSpaceForNulls.php b/src/Exercise/ASafeSpaceForNulls.php index d8887a8..117a66a 100644 --- a/src/Exercise/ASafeSpaceForNulls.php +++ b/src/Exercise/ASafeSpaceForNulls.php @@ -17,7 +17,6 @@ use PhpParser\NodeFinder; use PhpParser\Parser; use PhpSchool\PhpWorkshop\Check\FileComparisonCheck; -use PhpSchool\PhpWorkshop\Environment\CliTestEnvironment; use PhpSchool\PhpWorkshop\Exercise\AbstractExercise; use PhpSchool\PhpWorkshop\Exercise\CliExercise; use PhpSchool\PhpWorkshop\Exercise\ExerciseInterface; @@ -26,7 +25,6 @@ use PhpSchool\PhpWorkshop\Exercise\SubmissionPatchable; use PhpSchool\PhpWorkshop\ExerciseCheck\FileComparisonExerciseCheck; use PhpSchool\PhpWorkshop\ExerciseCheck\SelfCheck; -use PhpSchool\PhpWorkshop\ExerciseDispatcher; use PhpSchool\PhpWorkshop\ExerciseRunner\Context\ExecutionContext; use PhpSchool\PhpWorkshop\Patch; use PhpSchool\PhpWorkshop\Result\Failure; diff --git a/test/Exercise/ASafeSpaceForNullsTest.php b/test/Exercise/ASafeSpaceForNullsTest.php index 5a8aa4e..98023c5 100644 --- a/test/Exercise/ASafeSpaceForNullsTest.php +++ b/test/Exercise/ASafeSpaceForNullsTest.php @@ -20,11 +20,6 @@ public function getApplication(): Application return require __DIR__ . '/../../app/bootstrap.php'; } - public function tearDown(): void - { - $this->removeSolutionAsset('users.csv'); - } - public function testFailureWhenAgeAccessedWithoutNullSafe(): void { $this->runExercise('no-null-safe-age.php'); @@ -73,6 +68,23 @@ public function testFailureWhenAddressLine1AccessedWithoutNullSafe(): void ); } + + public function testFailureWhenCsvNotCorrect(): void + { + $this->runExercise('csv-wrong.php'); + + $this->assertVerifyWasNotSuccessful(); + + $this->assertResultsHasFailureAndMatches( + FileComparisonFailure::class, + function (FileComparisonFailure $failure) { + self::assertEquals('users.csv', $failure->getFileName()); + + return true; + } + ); + } + public function testFailureWhenAddressLine2AccessedWithoutNullSafe(): void { $this->runExercise('no-null-safe-address-line2.php'); @@ -97,22 +109,6 @@ public function testFailureWhenCsvNotExported(): void ); } - public function testFailureWhenCsvNotCorrect(): void - { - $this->runExercise('csv-wrong.php'); - - $this->assertVerifyWasNotSuccessful(); - - $this->assertResultsHasFailureAndMatches( - FileComparisonFailure::class, - function (FileComparisonFailure $failure) { - self::assertEquals('users.csv', $failure->getFileName()); - - return true; - } - ); - } - public function testWithCorrectSolution(): void { $this->runExercise('correct-solution.php'); diff --git a/test/Exercise/AllMixedUpTest.php b/test/Exercise/AllMixedUpTest.php index bc5f34c..8d8bad8 100644 --- a/test/Exercise/AllMixedUpTest.php +++ b/test/Exercise/AllMixedUpTest.php @@ -21,12 +21,6 @@ public function getApplication(): Application return require __DIR__ . '/../../app/bootstrap.php'; } - public function tearDown(): void - { - $this->removeSolutionAsset('param.log'); - parent::tearDown(); - } - public function testSuccessfulSolution(): void { $this->runExercise('solution-correct.php'); diff --git a/test/Exercise/LordOfTheStringsTest.php b/test/Exercise/LordOfTheStringsTest.php index 2cc9f62..60ce21e 100644 --- a/test/Exercise/LordOfTheStringsTest.php +++ b/test/Exercise/LordOfTheStringsTest.php @@ -36,7 +36,7 @@ public function testWithNoComposerFile(): void public function testWithNoCode(): void { - $this->runExercise('no-code/solution.php'); + $this->runExercise('no-code/solution.php', self::DIRECTORY_SOLUTION); $this->assertVerifyWasNotSuccessful(); @@ -45,7 +45,7 @@ public function testWithNoCode(): void public function testUsingBannedFunction(): void { - $this->runExercise('banned-functions/solution.php'); + $this->runExercise('banned-functions/solution.php', self::DIRECTORY_SOLUTION); $this->assertVerifyWasNotSuccessful(); @@ -73,7 +73,7 @@ function (FunctionRequirementsFailure $failure) { public function testWithCorrectSolution(): void { - $this->runExercise('correct-solution/solution.php'); + $this->runExercise('correct-solution/solution.php', self::DIRECTORY_SOLUTION); $this->assertVerifyWasSuccessful(); } diff --git a/test/Exercise/TheAttributesOfSuccessTest.php b/test/Exercise/TheAttributesOfSuccessTest.php index 7e480d7..6c1e42a 100644 --- a/test/Exercise/TheAttributesOfSuccessTest.php +++ b/test/Exercise/TheAttributesOfSuccessTest.php @@ -24,7 +24,7 @@ public function getApplication(): Application public function testSuccessfulSolution(): void { - $this->runExercise('correct-solution/solution.php'); + $this->runExercise('correct-solution/solution.php', self::DIRECTORY_SOLUTION); $this->assertVerifyWasSuccessful(); $this->assertOutputWasCorrect(); @@ -32,7 +32,7 @@ public function testSuccessfulSolution(): void public function testSuccessfulSolutionWithPromotedProperty(): void { - $this->runExercise('correct-solution-promoted/solution.php'); + $this->runExercise('correct-solution-promoted/solution.php', self::DIRECTORY_SOLUTION); $this->assertVerifyWasSuccessful(); $this->assertOutputWasCorrect(); @@ -40,7 +40,7 @@ public function testSuccessfulSolutionWithPromotedProperty(): void public function testModifyingExternalCodeFails(): void { - $this->runExercise('modified-external-code/solution.php'); + $this->runExercise('modified-external-code/solution.php', self::DIRECTORY_SOLUTION); $this->assertVerifyWasNotSuccessful(); $this->assertOutputWasCorrect(); @@ -57,7 +57,7 @@ function (FileComparisonFailure $failure) { public function testNotCallingDeserializeFails(): void { - $this->runExercise('no-deserialize-call/solution.php'); + $this->runExercise('no-deserialize-call/solution.php', self::DIRECTORY_SOLUTION); $this->assertVerifyWasNotSuccessful(); $this->assertOutputWasIncorrect(); @@ -73,7 +73,7 @@ function (FunctionRequirementsFailure $failure) { public function testNotDumpingObjectFails(): void { - $this->runExercise('no-var-dump/solution.php'); + $this->runExercise('no-var-dump/solution.php', self::DIRECTORY_SOLUTION); $this->assertVerifyWasNotSuccessful(); $this->assertOutputWasIncorrect(); @@ -89,7 +89,7 @@ function (FunctionRequirementsFailure $failure) { public function testWhenOutputIsIncorrectComparisonFails(): void { - $this->runExercise('incorrect-output/solution.php'); + $this->runExercise('incorrect-output/solution.php', self::DIRECTORY_SOLUTION); $this->assertVerifyWasNotSuccessful(); $this->assertOutputWasIncorrect(); @@ -102,7 +102,7 @@ public function testWhenOutputIsIncorrectComparisonFails(): void public function testWhenNoClassNamedReviewDefined(): void { - $this->runExercise('no-review-class/solution.php'); + $this->runExercise('no-review-class/solution.php', self::DIRECTORY_SOLUTION); $this->assertVerifyWasNotSuccessful(); @@ -111,7 +111,7 @@ public function testWhenNoClassNamedReviewDefined(): void public function testWhenNoMethodNamedObfuscateReviewerDefined(): void { - $this->runExercise('no-obfuscate-method/solution.php'); + $this->runExercise('no-obfuscate-method/solution.php', self::DIRECTORY_SOLUTION); $this->assertVerifyWasNotSuccessful(); @@ -120,7 +120,7 @@ public function testWhenNoMethodNamedObfuscateReviewerDefined(): void public function testWhenNoAttributeDefinedOnObfuscateReviewerMethod(): void { - $this->runExercise('no-attributes/solution.php'); + $this->runExercise('no-attributes/solution.php', self::DIRECTORY_SOLUTION); $this->assertVerifyWasNotSuccessful(); @@ -129,7 +129,7 @@ public function testWhenNoAttributeDefinedOnObfuscateReviewerMethod(): void public function testWhenNoAttributedNamedObfuscateUsedOnMethod(): void { - $this->runExercise('no-attribute-named-obfuscate/solution.php'); + $this->runExercise('no-attribute-named-obfuscate/solution.php', self::DIRECTORY_SOLUTION); $this->assertVerifyWasNotSuccessful(); @@ -141,7 +141,7 @@ public function testWhenNoAttributedNamedObfuscateUsedOnMethod(): void public function testWhenNoArgumentsPassedToObfuscateAttribute(): void { - $this->runExercise('no-arguments-obfuscate-attribute/solution.php'); + $this->runExercise('no-arguments-obfuscate-attribute/solution.php', self::DIRECTORY_SOLUTION); $this->assertVerifyWasNotSuccessful(); @@ -153,7 +153,7 @@ public function testWhenNoArgumentsPassedToObfuscateAttribute(): void public function testWhenIncorrectPropertyPassedToObfuscateAttribute(): void { - $this->runExercise('invalid-arg-obfuscate-attribute/solution.php'); + $this->runExercise('invalid-arg-obfuscate-attribute/solution.php', self::DIRECTORY_SOLUTION); $this->assertVerifyWasNotSuccessful(); @@ -165,7 +165,7 @@ public function testWhenIncorrectPropertyPassedToObfuscateAttribute(): void public function testWhenObfuscateAttributeNotDefined(): void { - $this->runExercise('no-obfuscate-class/solution.php'); + $this->runExercise('no-obfuscate-class/solution.php', self::DIRECTORY_SOLUTION); $this->assertVerifyWasNotSuccessful(); @@ -174,7 +174,7 @@ public function testWhenObfuscateAttributeNotDefined(): void public function testWhenObfuscateHasNoAttributes(): void { - $this->runExercise('obfuscate-no-attributes/solution.php'); + $this->runExercise('obfuscate-no-attributes/solution.php', self::DIRECTORY_SOLUTION); $this->assertVerifyWasNotSuccessful(); @@ -183,7 +183,7 @@ public function testWhenObfuscateHasNoAttributes(): void public function testWhenObfuscateAttributeIncorrectlyDefined(): void { - $this->runExercise('obfuscate-attribute-incorrect/solution.php'); + $this->runExercise('obfuscate-attribute-incorrect/solution.php', self::DIRECTORY_SOLUTION); $this->assertVerifyWasNotSuccessful(); @@ -192,7 +192,7 @@ public function testWhenObfuscateAttributeIncorrectlyDefined(): void public function testWhenObfuscateAttributeHasNoFlags(): void { - $this->runExercise('obfuscate-attribute-no-flags/solution.php'); + $this->runExercise('obfuscate-attribute-no-flags/solution.php', self::DIRECTORY_SOLUTION); $this->assertVerifyWasNotSuccessful(); @@ -201,7 +201,7 @@ public function testWhenObfuscateAttributeHasNoFlags(): void public function testWhenObfuscateAttributeConfigurationIsWrong(): void { - $this->runExercise('obfuscate-attribute-wrong-target/solution.php'); + $this->runExercise('obfuscate-attribute-wrong-target/solution.php', self::DIRECTORY_SOLUTION); $this->assertVerifyWasNotSuccessful(); @@ -213,7 +213,7 @@ public function testWhenObfuscateAttributeConfigurationIsWrong(): void public function testWhenObfuscateAttributeHasNoPublicPropertyNamedKey(): void { - $this->runExercise('no-public-property-named-key/solution.php'); + $this->runExercise('no-public-property-named-key/solution.php', self::DIRECTORY_SOLUTION); $this->assertVerifyWasNotSuccessful(); From 8bcd69b7b09141e47da7c59cc03a73f08d06f58b Mon Sep 17 00:00:00 2001 From: Aydin Hassan Date: Sat, 25 May 2024 16:01:13 +0200 Subject: [PATCH 07/27] Run tests with both host + docker --- .github/workflows/build.yml | 3 ++- composer.lock | 8 ++++---- phpunit.xml | 2 +- test/Exercise/ThrowAnExpressionTest.php | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5b09072..d7a821d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -33,7 +33,8 @@ jobs: - name: Run phpunit tests run: | mkdir -p build/logs - vendor/bin/phpunit --coverage-clover ./build/logs/clover.xml + PROCESS_FACTORY=host vendor/bin/phpunit + PROCESS_FACTORY=docker vendor/bin/phpunit --coverage-clover ./build/logs/clover.xml - name: Run phpcs run: composer cs diff --git a/composer.lock b/composer.lock index 23a2645..fdd73e7 100644 --- a/composer.lock +++ b/composer.lock @@ -1130,12 +1130,12 @@ "source": { "type": "git", "url": "https://github.com/php-school/php-workshop.git", - "reference": "0790024a850786bfcbcefe7873da37bcc7b8e22d" + "reference": "065947216d954289c70826afe27ccf0b6f49f109" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-school/php-workshop/zipball/0790024a850786bfcbcefe7873da37bcc7b8e22d", - "reference": "0790024a850786bfcbcefe7873da37bcc7b8e22d", + "url": "https://api.github.com/repos/php-school/php-workshop/zipball/065947216d954289c70826afe27ccf0b6f49f109", + "reference": "065947216d954289c70826afe27ccf0b6f49f109", "shasum": "" }, "require": { @@ -1211,7 +1211,7 @@ "issues": "https://github.com/php-school/php-workshop/issues", "source": "https://github.com/php-school/php-workshop/tree/docker-fixes" }, - "time": "2024-05-25T13:44:46+00:00" + "time": "2024-05-25T13:59:57+00:00" }, { "name": "php-school/terminal", diff --git a/phpunit.xml b/phpunit.xml index dbf5daa..eac0d7d 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -10,6 +10,6 @@ ./test/solutions - + diff --git a/test/Exercise/ThrowAnExpressionTest.php b/test/Exercise/ThrowAnExpressionTest.php index efbd979..161748d 100644 --- a/test/Exercise/ThrowAnExpressionTest.php +++ b/test/Exercise/ThrowAnExpressionTest.php @@ -34,7 +34,7 @@ public function testThrowingWrongException(): void self::assertInstanceOf(Success::class, $output->getResults()[1]); self::assertMatchesRegularExpression( - '/Fatal error: Uncaught Exception: Access denied!/', + '/Fatal error:\s+Uncaught Exception: Access denied!/', $output->getResults()[0]->getReason() ); From 8f97aa207e94184605f12e855bbbd522b02fb44a Mon Sep 17 00:00:00 2001 From: Aydin Hassan Date: Fri, 6 Sep 2024 21:27:38 +0200 Subject: [PATCH 08/27] Update deps --- composer.lock | 242 +++++++++++++++++++++++++------------------------- 1 file changed, 123 insertions(+), 119 deletions(-) diff --git a/composer.lock b/composer.lock index fdd73e7..695d33d 100644 --- a/composer.lock +++ b/composer.lock @@ -138,22 +138,22 @@ }, { "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" @@ -164,9 +164,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": { @@ -244,7 +244,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": [ { @@ -260,20 +260,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.3", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223" + "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223", - "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223", + "url": "https://api.github.com/repos/guzzle/promises/zipball/6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", + "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", "shasum": "" }, "require": { @@ -281,7 +281,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": { @@ -327,7 +327,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.3" }, "funding": [ { @@ -343,20 +343,20 @@ "type": "tidelift" } ], - "time": "2023-12-03T20:19:20+00:00" + "time": "2024-07-18T10:29:17+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": { @@ -371,8 +371,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" @@ -443,7 +443,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": [ { @@ -459,7 +459,7 @@ "type": "tidelift" } ], - "time": "2023-12-03T20:05:35+00:00" + "time": "2024-07-18T11:15:46+00:00" }, { "name": "kevinlebrun/colors.php", @@ -518,26 +518,27 @@ }, { "name": "laravel/serializable-closure", - "version": "v1.3.3", + "version": "v1.3.4", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "3dbf8a8e914634c48d389c1234552666b3d43754" + "reference": "61b87392d986dc49ad5ef64e75b1ff5fee24ef81" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/3dbf8a8e914634c48d389c1234552666b3d43754", - "reference": "3dbf8a8e914634c48d389c1234552666b3d43754", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/61b87392d986dc49ad5ef64e75b1ff5fee24ef81", + "reference": "61b87392d986dc49ad5ef64e75b1ff5fee24ef81", "shasum": "" }, "require": { "php": "^7.3|^8.0" }, "require-dev": { - "nesbot/carbon": "^2.61", + "illuminate/support": "^8.0|^9.0|^10.0|^11.0", + "nesbot/carbon": "^2.61|^3.0", "pestphp/pest": "^1.21.3", "phpstan/phpstan": "^1.8.2", - "symfony/var-dumper": "^5.4.11" + "symfony/var-dumper": "^5.4.11|^6.2.0|^7.0.0" }, "type": "library", "extra": { @@ -574,7 +575,7 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2023-11-08T14:08:06+00:00" + "time": "2024-08-02T07:48:17+00:00" }, { "name": "league/commonmark", @@ -1130,12 +1131,12 @@ "source": { "type": "git", "url": "https://github.com/php-school/php-workshop.git", - "reference": "065947216d954289c70826afe27ccf0b6f49f109" + "reference": "73febf8c62d982cd74896df9266522dc2a5153b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-school/php-workshop/zipball/065947216d954289c70826afe27ccf0b6f49f109", - "reference": "065947216d954289c70826afe27ccf0b6f49f109", + "url": "https://api.github.com/repos/php-school/php-workshop/zipball/73febf8c62d982cd74896df9266522dc2a5153b5", + "reference": "73febf8c62d982cd74896df9266522dc2a5153b5", "shasum": "" }, "require": { @@ -1211,7 +1212,7 @@ "issues": "https://github.com/php-school/php-workshop/issues", "source": "https://github.com/php-school/php-workshop/tree/docker-fixes" }, - "time": "2024-05-25T13:59:57+00:00" + "time": "2024-09-04T11:22:50+00:00" }, { "name": "php-school/terminal", @@ -1641,23 +1642,25 @@ }, { "name": "symfony/filesystem", - "version": "v6.4.7", + "version": "v6.4.9", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "78dde75f8f6dbbca4ec436a4b0087f7af02076d4" + "reference": "b51ef8059159330b74a4d52f68e671033c0fe463" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/78dde75f8f6dbbca4ec436a4b0087f7af02076d4", - "reference": "78dde75f8f6dbbca4ec436a4b0087f7af02076d4", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/b51ef8059159330b74a4d52f68e671033c0fe463", + "reference": "b51ef8059159330b74a4d52f68e671033c0fe463", "shasum": "" }, "require": { "php": ">=8.1", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8", - "symfony/process": "^5.4|^6.4" + "symfony/polyfill-mbstring": "~1.8" + }, + "require-dev": { + "symfony/process": "^5.4|^6.4|^7.0" }, "type": "library", "autoload": { @@ -1685,7 +1688,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.4.7" + "source": "https://github.com/symfony/filesystem/tree/v6.4.9" }, "funding": [ { @@ -1701,20 +1704,20 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:22:46+00:00" + "time": "2024-06-28T09:49:33+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" + "reference": "0424dff1c58f028c451efff2045f5d92410bd540" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", - "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/0424dff1c58f028c451efff2045f5d92410bd540", + "reference": "0424dff1c58f028c451efff2045f5d92410bd540", "shasum": "" }, "require": { @@ -1764,7 +1767,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.30.0" }, "funding": [ { @@ -1780,20 +1783,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-05-31T15:07:36+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.29.0", + "version": "v1.30.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" + "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", - "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c", + "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c", "shasum": "" }, "require": { @@ -1844,7 +1847,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.29.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0" }, "funding": [ { @@ -1860,20 +1863,20 @@ "type": "tidelift" } ], - "time": "2024-01-29T20:11:03+00:00" + "time": "2024-06-19T12:30:46+00:00" }, { "name": "symfony/process", - "version": "v6.4.7", + "version": "v6.4.8", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "cdb1c81c145fd5aa9b0038bab694035020943381" + "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/cdb1c81c145fd5aa9b0038bab694035020943381", - "reference": "cdb1c81c145fd5aa9b0038bab694035020943381", + "url": "https://api.github.com/repos/symfony/process/zipball/8d92dd79149f29e89ee0f480254db595f6a6a2c5", + "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5", "shasum": "" }, "require": { @@ -1905,7 +1908,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.7" + "source": "https://github.com/symfony/process/tree/v6.4.8" }, "funding": [ { @@ -1921,7 +1924,7 @@ "type": "tidelift" } ], - "time": "2024-04-18T09:22:46+00:00" + "time": "2024-05-31T14:49:08+00:00" } ], "packages-dev": [ @@ -1997,16 +2000,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.11.1", + "version": "1.12.0", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", - "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", "shasum": "" }, "require": { @@ -2014,11 +2017,12 @@ }, "conflict": { "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3,<3.2.2" + "doctrine/common": "<2.13.3 || >=3 <3.2.2" }, "require-dev": { "doctrine/collections": "^1.6.8", "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" }, "type": "library", @@ -2044,7 +2048,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" }, "funding": [ { @@ -2052,7 +2056,7 @@ "type": "tidelift" } ], - "time": "2023-03-08T13:26:56+00:00" + "time": "2024-06-12T14:39:25+00:00" }, { "name": "phar-io/manifest", @@ -2174,16 +2178,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.11.2", + "version": "1.12.2", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "0d5d4294a70deb7547db655c47685d680e39cfec" + "reference": "0ca1c7bb55fca8fe6448f16fff0f311ccec960a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/0d5d4294a70deb7547db655c47685d680e39cfec", - "reference": "0d5d4294a70deb7547db655c47685d680e39cfec", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/0ca1c7bb55fca8fe6448f16fff0f311ccec960a1", + "reference": "0ca1c7bb55fca8fe6448f16fff0f311ccec960a1", "shasum": "" }, "require": { @@ -2228,39 +2232,39 @@ "type": "github" } ], - "time": "2024-05-24T13:23:04+00:00" + "time": "2024-09-05T16:09:28+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.31", + "version": "9.2.32", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965" + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/48c34b5d8d983006bd2adc2d0de92963b9155965", - "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5", + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5", "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": ">=7.3", - "phpunit/php-file-iterator": "^3.0.3", - "phpunit/php-text-template": "^2.0.2", - "sebastian/code-unit-reverse-lookup": "^2.0.2", - "sebastian/complexity": "^2.0", - "sebastian/environment": "^5.1.2", - "sebastian/lines-of-code": "^1.0.3", - "sebastian/version": "^3.0.1", - "theseer/tokenizer": "^1.2.0" + "phpunit/php-file-iterator": "^3.0.6", + "phpunit/php-text-template": "^2.0.4", + "sebastian/code-unit-reverse-lookup": "^2.0.3", + "sebastian/complexity": "^2.0.3", + "sebastian/environment": "^5.1.5", + "sebastian/lines-of-code": "^1.0.4", + "sebastian/version": "^3.0.2", + "theseer/tokenizer": "^1.2.3" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^9.6" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -2269,7 +2273,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.2-dev" + "dev-main": "9.2.x-dev" } }, "autoload": { @@ -2298,7 +2302,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/9.2.31" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.32" }, "funding": [ { @@ -2306,7 +2310,7 @@ "type": "github" } ], - "time": "2024-03-02T06:37:42+00:00" + "time": "2024-08-22T04:23:01+00:00" }, { "name": "phpunit/php-file-iterator", @@ -2551,45 +2555,45 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.19", + "version": "9.6.20", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "a1a54a473501ef4cdeaae4e06891674114d79db8" + "reference": "49d7820565836236411f5dc002d16dd689cde42f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a1a54a473501ef4cdeaae4e06891674114d79db8", - "reference": "a1a54a473501ef4cdeaae4e06891674114d79db8", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/49d7820565836236411f5dc002d16dd689cde42f", + "reference": "49d7820565836236411f5dc002d16dd689cde42f", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.3.1 || ^2", + "doctrine/instantiator": "^1.5.0 || ^2", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.10.1", - "phar-io/manifest": "^2.0.3", - "phar-io/version": "^3.0.2", + "myclabs/deep-copy": "^1.12.0", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", "php": ">=7.3", - "phpunit/php-code-coverage": "^9.2.28", - "phpunit/php-file-iterator": "^3.0.5", + "phpunit/php-code-coverage": "^9.2.31", + "phpunit/php-file-iterator": "^3.0.6", "phpunit/php-invoker": "^3.1.1", - "phpunit/php-text-template": "^2.0.3", - "phpunit/php-timer": "^5.0.2", - "sebastian/cli-parser": "^1.0.1", - "sebastian/code-unit": "^1.0.6", + "phpunit/php-text-template": "^2.0.4", + "phpunit/php-timer": "^5.0.3", + "sebastian/cli-parser": "^1.0.2", + "sebastian/code-unit": "^1.0.8", "sebastian/comparator": "^4.0.8", - "sebastian/diff": "^4.0.3", - "sebastian/environment": "^5.1.3", - "sebastian/exporter": "^4.0.5", - "sebastian/global-state": "^5.0.1", - "sebastian/object-enumerator": "^4.0.3", - "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^3.2", + "sebastian/diff": "^4.0.6", + "sebastian/environment": "^5.1.5", + "sebastian/exporter": "^4.0.6", + "sebastian/global-state": "^5.0.7", + "sebastian/object-enumerator": "^4.0.4", + "sebastian/resource-operations": "^3.0.4", + "sebastian/type": "^3.2.1", "sebastian/version": "^3.0.2" }, "suggest": { @@ -2634,7 +2638,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.19" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.20" }, "funding": [ { @@ -2650,7 +2654,7 @@ "type": "tidelift" } ], - "time": "2024-04-05T04:35:58+00:00" + "time": "2024-07-10T11:45:39+00:00" }, { "name": "sebastian/cli-parser", @@ -3617,16 +3621,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.10.1", + "version": "3.10.2", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "8f90f7a53ce271935282967f53d0894f8f1ff877" + "reference": "86e5f5dd9a840c46810ebe5ff1885581c42a3017" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/8f90f7a53ce271935282967f53d0894f8f1ff877", - "reference": "8f90f7a53ce271935282967f53d0894f8f1ff877", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/86e5f5dd9a840c46810ebe5ff1885581c42a3017", + "reference": "86e5f5dd9a840c46810ebe5ff1885581c42a3017", "shasum": "" }, "require": { @@ -3693,7 +3697,7 @@ "type": "open_collective" } ], - "time": "2024-05-22T21:24:41+00:00" + "time": "2024-07-21T23:26:44+00:00" }, { "name": "theseer/tokenizer", From ff1a833118b2e4807fa22b2e1860156f3aa03eb3 Mon Sep 17 00:00:00 2001 From: Aydin Hassan Date: Thu, 22 Oct 2026 17:07:30 +0200 Subject: [PATCH 09/27] Upgrade to PHP 8.2+, PHPUnit 11, PHPStan 2, PHPCS 3.13 composer.lock needs regenerating once php-workshop docker-fixes is pushed. Co-Authored-By: Claude Opus 5.5 --- .gitignore | 1 + composer.json | 9 ++++----- phpstan.neon | 9 +++------ phpunit.xml | 12 ++++++------ 4 files changed, 14 insertions(+), 17 deletions(-) diff --git a/.gitignore b/.gitignore index 6d843a5..d8398de 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ /exercises/*/solution/vendor /test/solutions/*/*/vendor .phpunit.result.cache +.phpunit.cache diff --git a/composer.json b/composer.json index 5fd1fb9..f9aa3f6 100644 --- a/composer.json +++ b/composer.json @@ -21,14 +21,13 @@ } ], "require": { - "php": "^8.0", + "php": ">=8.2", "php-school/php-workshop": "dev-docker-fixes" }, "require-dev": { - "phpunit/phpunit": "^9", - "squizlabs/php_codesniffer": "^3.5", - "phpstan/phpstan": "^1.8.10", - "timeweb/phpstan-enum": "^3.1" + "phpunit/phpunit": "^11.5", + "squizlabs/php_codesniffer": "^3.13", + "phpstan/phpstan": "^2.1" }, "autoload": { "psr-4": { diff --git a/phpstan.neon b/phpstan.neon index 53a8cf2..45484b8 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -8,9 +8,6 @@ parameters: - message: '#If condition is always true\.#' path: src/Exercise/ASafeSpaceForNulls.php - - excludePaths: - - src/TestUtils/WorkshopExerciseTest.php - -includes: - - vendor/timeweb/phpstan-enum/extension.neon + - + message: '#Parameter \#1 \$value of method PhpParser\\BuilderFactory::val\(\) expects .*, mixed given\.#' + path: src/Exercise/ASafeSpaceForNulls.php diff --git a/phpunit.xml b/phpunit.xml index eac0d7d..0debfcf 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -1,14 +1,14 @@ - - - - ./src - - + ./test ./test/solutions + + + ./src + + From 8ef53d66d15f14b77edd0e0af95e4ded196a1b01 Mon Sep 17 00:00:00 2001 From: Aydin Hassan Date: Thu, 22 Oct 2026 17:07:30 +0200 Subject: [PATCH 10/27] Fix code for nikic/php-parser 5 and PHPStan 2 Co-Authored-By: Claude Opus 5.5 --- src/Exercise/ASafeSpaceForNulls.php | 9 ++++++--- src/Exercise/HaveTheLastSay.php | 14 ++++++++++---- src/Exercise/PhpGetsAPromotion.php | 2 +- src/Exercise/TheAttributesOfSuccess.php | 6 ++---- 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/Exercise/ASafeSpaceForNulls.php b/src/Exercise/ASafeSpaceForNulls.php index 117a66a..32ce609 100644 --- a/src/Exercise/ASafeSpaceForNulls.php +++ b/src/Exercise/ASafeSpaceForNulls.php @@ -83,9 +83,12 @@ public function getPatch(): Patch $statements[] = $factory->class('User') ->addStmt($factory->property('firstName')->setType('string')->makePublic()) ->addStmt($factory->property('lastName')->setType('string')->makePublic()) - ->addStmt($factory->property('age')->setType(new NullableType('int'))->makePublic()->setDefault(null)) + ->addStmt($factory->property('age') + ->setType(new NullableType(new Identifier('int'))) + ->makePublic() + ->setDefault(null)) ->addStmt($factory->property('address') - ->setType(new NullableType('Address')) + ->setType(new NullableType(new Identifier('Address'))) ->makePublic() ->setDefault(null)) ->getNode(); @@ -94,7 +97,7 @@ public function getPatch(): Patch ->addStmt($factory->property('number')->setType('int')->makePublic()) ->addStmt($factory->property('addressLine1')->setType('string')->makePublic()) ->addStmt($factory->property('addressLine2') - ->setType(new NullableType('string')) + ->setType(new NullableType(new Identifier('string'))) ->makePublic() ->setDefault(null)) ->getNode(); diff --git a/src/Exercise/HaveTheLastSay.php b/src/Exercise/HaveTheLastSay.php index 94a7c6d..8ca0578 100644 --- a/src/Exercise/HaveTheLastSay.php +++ b/src/Exercise/HaveTheLastSay.php @@ -132,25 +132,31 @@ public function check(ExecutionContext $context): ResultInterface ); } - if (count($funcCall->getArgs()) > 2) { + //PHP 8.4+ deprecates relying on the default of the escape argument, so we allow it to be passed too + $args = array_values(array_filter( + $funcCall->getArgs(), + fn ($arg) => $arg->name === null || $arg->name->name !== 'escape' + )); + + if (count($args) > 2) { return Failure::fromNameAndReason( $this->getName(), 'You should only specify the stream and separator arguments, no others' ); } - if (!isset($funcCall->getArgs()[1])) { + if (!isset($args[1])) { return Failure::fromNameAndReason($this->getName(), 'The separator argument has not been specified'); } - if (!$funcCall->getArgs()[1]->name) { + if (!$args[1]->name) { return Failure::fromNameAndReason( $this->getName(), 'The second positional argument should not be specified' ); } - if ($funcCall->getArgs()[1]->name->name !== 'separator') { + if ($args[1]->name->name !== 'separator') { return Failure::fromNameAndReason( $this->getName(), 'A named argument has been used, but not for the separator argument' diff --git a/src/Exercise/PhpGetsAPromotion.php b/src/Exercise/PhpGetsAPromotion.php index a1c7c69..091ad3f 100644 --- a/src/Exercise/PhpGetsAPromotion.php +++ b/src/Exercise/PhpGetsAPromotion.php @@ -144,8 +144,8 @@ public function check(ExecutionContext $context): ResultInterface $obj = new $className(...$args); + /** @var array $actual */ $actual = $properties - ->each(fn (\ReflectionProperty $prop) => $prop->setAccessible(true)) ->flatMap(fn (\ReflectionProperty $prop) => [ $prop->getName() => $prop->isInitialized($obj) ? $prop->getValue($obj) : null ]) diff --git a/src/Exercise/TheAttributesOfSuccess.php b/src/Exercise/TheAttributesOfSuccess.php index fde0079..c6fdb34 100644 --- a/src/Exercise/TheAttributesOfSuccess.php +++ b/src/Exercise/TheAttributesOfSuccess.php @@ -12,8 +12,7 @@ use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Property; -use PhpParser\Node\Stmt\PropertyProperty; -use PhpParser\Node\VarLikeIdentifier; +use PhpParser\Node\PropertyItem; use PhpParser\NodeFinder; use PhpParser\Parser; use PhpSchool\PhpWorkshop\Check\FileComparisonCheck; @@ -188,8 +187,7 @@ public function check(ExecutionContext $context): ResultInterface && $node->isPublic() && $node->type instanceof Identifier && $node->type->name === 'string' - && $node->props[0] instanceof PropertyProperty - && $node->props[0]->name instanceof VarLikeIdentifier + && $node->props[0] instanceof PropertyItem && $node->props[0]->name->name === 'key'; }); From e7a298d0bd8e583badfd29c02c15c60502d826c6 Mon Sep 17 00:00:00 2001 From: Aydin Hassan Date: Thu, 22 Oct 2026 17:07:30 +0200 Subject: [PATCH 11/27] Migrate tests to PHPUnit 11 (restore global error handler left by Application) Co-Authored-By: Claude Opus 5.5 --- test/Exercise/AMatchMadeInHeavenTest.php | 4 ++-- test/Exercise/ASafeSpaceForNullsTest.php | 4 ++-- test/Exercise/AllMixedUpTest.php | 4 ++-- test/Exercise/CautionWithCatchesTest.php | 4 ++-- test/Exercise/HaveTheLastSayTest.php | 4 ++-- test/Exercise/InfiniteDivisionsTest.php | 4 ++-- test/Exercise/LordOfTheStringsTest.php | 4 ++-- test/Exercise/PhpGetsAPromotionTest.php | 4 ++-- test/Exercise/StringifyToDemystifyTest.php | 4 ++-- test/Exercise/TheAttributesOfSuccessTest.php | 4 ++-- test/Exercise/TheReturnOfStaticTest.php | 4 ++-- test/Exercise/ThrowAnExpressionTest.php | 4 ++-- test/Exercise/UniteTheTypesTest.php | 4 ++-- test/ExerciseTestCase.php | 18 ++++++++++++++++++ 14 files changed, 44 insertions(+), 26 deletions(-) create mode 100644 test/ExerciseTestCase.php diff --git a/test/Exercise/AMatchMadeInHeavenTest.php b/test/Exercise/AMatchMadeInHeavenTest.php index 6732f99..8315514 100644 --- a/test/Exercise/AMatchMadeInHeavenTest.php +++ b/test/Exercise/AMatchMadeInHeavenTest.php @@ -7,9 +7,9 @@ use PhpSchool\PHP8Appreciate\Exercise\AMatchMadeInHeaven; use PhpSchool\PhpWorkshop\Application; use PhpSchool\PhpWorkshop\Result\Failure; -use PhpSchool\PhpWorkshop\TestUtils\WorkshopExerciseTest; +use PhpSchool\PHP8AppreciateTest\ExerciseTestCase; -class AMatchMadeInHeavenTest extends WorkshopExerciseTest +class AMatchMadeInHeavenTest extends ExerciseTestCase { public function getApplication(): Application { diff --git a/test/Exercise/ASafeSpaceForNullsTest.php b/test/Exercise/ASafeSpaceForNullsTest.php index 98023c5..0f04512 100644 --- a/test/Exercise/ASafeSpaceForNullsTest.php +++ b/test/Exercise/ASafeSpaceForNullsTest.php @@ -6,9 +6,9 @@ use PhpSchool\PhpWorkshop\Application; use PhpSchool\PhpWorkshop\Result\Failure; use PhpSchool\PhpWorkshop\Result\FileComparisonFailure; -use PhpSchool\PhpWorkshop\TestUtils\WorkshopExerciseTest; +use PhpSchool\PHP8AppreciateTest\ExerciseTestCase; -class ASafeSpaceForNullsTest extends WorkshopExerciseTest +class ASafeSpaceForNullsTest extends ExerciseTestCase { public function getExerciseClass(): string { diff --git a/test/Exercise/AllMixedUpTest.php b/test/Exercise/AllMixedUpTest.php index 8d8bad8..984be7c 100644 --- a/test/Exercise/AllMixedUpTest.php +++ b/test/Exercise/AllMixedUpTest.php @@ -7,9 +7,9 @@ use PhpSchool\PhpWorkshop\Result\Failure; use PhpSchool\PhpWorkshop\Result\FileComparisonFailure; use PhpSchool\PhpWorkshop\Result\FunctionRequirementsFailure; -use PhpSchool\PhpWorkshop\TestUtils\WorkshopExerciseTest; +use PhpSchool\PHP8AppreciateTest\ExerciseTestCase; -class AllMixedUpTest extends WorkshopExerciseTest +class AllMixedUpTest extends ExerciseTestCase { public function getExerciseClass(): string { diff --git a/test/Exercise/CautionWithCatchesTest.php b/test/Exercise/CautionWithCatchesTest.php index fcfb6fb..aaa21f7 100644 --- a/test/Exercise/CautionWithCatchesTest.php +++ b/test/Exercise/CautionWithCatchesTest.php @@ -7,9 +7,9 @@ use PhpSchool\PHP8Appreciate\Exercise\CautionWithCatches; use PhpSchool\PhpWorkshop\Application; use PhpSchool\PhpWorkshop\Result\Failure; -use PhpSchool\PhpWorkshop\TestUtils\WorkshopExerciseTest; +use PhpSchool\PHP8AppreciateTest\ExerciseTestCase; -class CautionWithCatchesTest extends WorkshopExerciseTest +class CautionWithCatchesTest extends ExerciseTestCase { public function getExerciseClass(): string { diff --git a/test/Exercise/HaveTheLastSayTest.php b/test/Exercise/HaveTheLastSayTest.php index 7c13dac..3be1bad 100644 --- a/test/Exercise/HaveTheLastSayTest.php +++ b/test/Exercise/HaveTheLastSayTest.php @@ -9,9 +9,9 @@ use PhpSchool\PhpWorkshop\Application; use PhpSchool\PhpWorkshop\Result\Failure; use PhpSchool\PhpWorkshop\Result\FunctionRequirementsFailure; -use PhpSchool\PhpWorkshop\TestUtils\WorkshopExerciseTest; +use PhpSchool\PHP8AppreciateTest\ExerciseTestCase; -class HaveTheLastSayTest extends WorkshopExerciseTest +class HaveTheLastSayTest extends ExerciseTestCase { public function getApplication(): Application { diff --git a/test/Exercise/InfiniteDivisionsTest.php b/test/Exercise/InfiniteDivisionsTest.php index 742bd0c..5dff171 100644 --- a/test/Exercise/InfiniteDivisionsTest.php +++ b/test/Exercise/InfiniteDivisionsTest.php @@ -5,9 +5,9 @@ use PhpSchool\PHP8Appreciate\Exercise\InfiniteDivisions; use PhpSchool\PhpWorkshop\Application; use PhpSchool\PhpWorkshop\Result\Failure; -use PhpSchool\PhpWorkshop\TestUtils\WorkshopExerciseTest; +use PhpSchool\PHP8AppreciateTest\ExerciseTestCase; -class InfiniteDivisionsTest extends WorkshopExerciseTest +class InfiniteDivisionsTest extends ExerciseTestCase { public function getExerciseClass(): string { diff --git a/test/Exercise/LordOfTheStringsTest.php b/test/Exercise/LordOfTheStringsTest.php index 60ce21e..7629790 100644 --- a/test/Exercise/LordOfTheStringsTest.php +++ b/test/Exercise/LordOfTheStringsTest.php @@ -7,9 +7,9 @@ use PhpSchool\PhpWorkshop\Result\ComposerFailure; use PhpSchool\PhpWorkshop\Result\Failure; use PhpSchool\PhpWorkshop\Result\FunctionRequirementsFailure; -use PhpSchool\PhpWorkshop\TestUtils\WorkshopExerciseTest; +use PhpSchool\PHP8AppreciateTest\ExerciseTestCase; -class LordOfTheStringsTest extends WorkshopExerciseTest +class LordOfTheStringsTest extends ExerciseTestCase { public function getApplication(): Application { diff --git a/test/Exercise/PhpGetsAPromotionTest.php b/test/Exercise/PhpGetsAPromotionTest.php index 1c4f87e..e779abb 100644 --- a/test/Exercise/PhpGetsAPromotionTest.php +++ b/test/Exercise/PhpGetsAPromotionTest.php @@ -7,9 +7,9 @@ use PhpSchool\PHP8Appreciate\Exercise\PhpGetsAPromotion; use PhpSchool\PhpWorkshop\Application; use PhpSchool\PhpWorkshop\Result\Failure; -use PhpSchool\PhpWorkshop\TestUtils\WorkshopExerciseTest; +use PhpSchool\PHP8AppreciateTest\ExerciseTestCase; -class PhpGetsAPromotionTest extends WorkshopExerciseTest +class PhpGetsAPromotionTest extends ExerciseTestCase { public function getExerciseClass(): string { diff --git a/test/Exercise/StringifyToDemystifyTest.php b/test/Exercise/StringifyToDemystifyTest.php index 129c4a2..4951b33 100644 --- a/test/Exercise/StringifyToDemystifyTest.php +++ b/test/Exercise/StringifyToDemystifyTest.php @@ -8,9 +8,9 @@ use PhpSchool\PhpWorkshop\Application; use PhpSchool\PhpWorkshop\Result\Failure; use PhpSchool\PhpWorkshop\Result\FunctionRequirementsFailure; -use PhpSchool\PhpWorkshop\TestUtils\WorkshopExerciseTest; +use PhpSchool\PHP8AppreciateTest\ExerciseTestCase; -class StringifyToDemystifyTest extends WorkshopExerciseTest +class StringifyToDemystifyTest extends ExerciseTestCase { public function getExerciseClass(): string { diff --git a/test/Exercise/TheAttributesOfSuccessTest.php b/test/Exercise/TheAttributesOfSuccessTest.php index 6c1e42a..bd5f143 100644 --- a/test/Exercise/TheAttributesOfSuccessTest.php +++ b/test/Exercise/TheAttributesOfSuccessTest.php @@ -8,9 +8,9 @@ use PhpSchool\PhpWorkshop\Result\Failure; use PhpSchool\PhpWorkshop\Result\FileComparisonFailure; use PhpSchool\PhpWorkshop\Result\FunctionRequirementsFailure; -use PhpSchool\PhpWorkshop\TestUtils\WorkshopExerciseTest; +use PhpSchool\PHP8AppreciateTest\ExerciseTestCase; -class TheAttributesOfSuccessTest extends WorkshopExerciseTest +class TheAttributesOfSuccessTest extends ExerciseTestCase { public function getExerciseClass(): string { diff --git a/test/Exercise/TheReturnOfStaticTest.php b/test/Exercise/TheReturnOfStaticTest.php index a964f4a..a2a619f 100644 --- a/test/Exercise/TheReturnOfStaticTest.php +++ b/test/Exercise/TheReturnOfStaticTest.php @@ -5,9 +5,9 @@ use PhpSchool\PHP8Appreciate\Exercise\TheReturnOfStatic; use PhpSchool\PhpWorkshop\Application; use PhpSchool\PhpWorkshop\Result\Failure; -use PhpSchool\PhpWorkshop\TestUtils\WorkshopExerciseTest; +use PhpSchool\PHP8AppreciateTest\ExerciseTestCase; -class TheReturnOfStaticTest extends WorkshopExerciseTest +class TheReturnOfStaticTest extends ExerciseTestCase { public function getExerciseClass(): string { diff --git a/test/Exercise/ThrowAnExpressionTest.php b/test/Exercise/ThrowAnExpressionTest.php index 161748d..0b58b85 100644 --- a/test/Exercise/ThrowAnExpressionTest.php +++ b/test/Exercise/ThrowAnExpressionTest.php @@ -8,9 +8,9 @@ use PhpSchool\PhpWorkshop\Result\Cgi\RequestFailure; use PhpSchool\PhpWorkshop\Result\Cgi\Success; use PhpSchool\PhpWorkshop\Result\Failure; -use PhpSchool\PhpWorkshop\TestUtils\WorkshopExerciseTest; +use PhpSchool\PHP8AppreciateTest\ExerciseTestCase; -class ThrowAnExpressionTest extends WorkshopExerciseTest +class ThrowAnExpressionTest extends ExerciseTestCase { public function getExerciseClass(): string { diff --git a/test/Exercise/UniteTheTypesTest.php b/test/Exercise/UniteTheTypesTest.php index 11dfd17..5ff2fa9 100644 --- a/test/Exercise/UniteTheTypesTest.php +++ b/test/Exercise/UniteTheTypesTest.php @@ -5,9 +5,9 @@ use PhpSchool\PHP8Appreciate\Exercise\UniteTheTypes; use PhpSchool\PhpWorkshop\Application; use PhpSchool\PhpWorkshop\Result\Failure; -use PhpSchool\PhpWorkshop\TestUtils\WorkshopExerciseTest; +use PhpSchool\PHP8AppreciateTest\ExerciseTestCase; -class UniteTheTypesTest extends WorkshopExerciseTest +class UniteTheTypesTest extends ExerciseTestCase { public function getExerciseClass(): string { diff --git a/test/ExerciseTestCase.php b/test/ExerciseTestCase.php new file mode 100644 index 0000000..7b80bad --- /dev/null +++ b/test/ExerciseTestCase.php @@ -0,0 +1,18 @@ + Date: Thu, 22 Oct 2026 17:07:30 +0200 Subject: [PATCH 12/27] Fix PHP 8.4+ deprecations in solutions: fgetcsv/fputcsv escape, symfony/console 7 HaveTheLastSay now permits an extra named escape argument. Co-Authored-By: Claude Opus 5.5 --- .../solution/solution.php | 5 +- .../have-the-last-say/problem/problem.md | 2 + .../have-the-last-say/solution/solution.php | 2 +- .../solution/composer.json | 2 +- .../solution/composer.lock | 499 +++++++----------- .../correct-solution.php | 4 +- .../a-safe-space-for-nulls/csv-wrong.php | 4 +- .../have-the-last-say/solution-correct.php | 2 +- .../solution-no-stream-arg.php | 2 +- .../solution-wrong-output.php | 2 +- .../banned-functions/composer.json | 2 +- .../banned-functions/composer.lock | 499 +++++++----------- .../correct-solution/composer.json | 2 +- .../correct-solution/composer.lock | 499 +++++++----------- .../lord-of-the-strings/no-code/composer.json | 2 +- .../lord-of-the-strings/no-code/composer.lock | 499 +++++++----------- 16 files changed, 761 insertions(+), 1266 deletions(-) diff --git a/exercises/a-safe-space-for-nulls/solution/solution.php b/exercises/a-safe-space-for-nulls/solution/solution.php index 68b0d2b..0338007 100644 --- a/exercises/a-safe-space-for-nulls/solution/solution.php +++ b/exercises/a-safe-space-for-nulls/solution/solution.php @@ -1,7 +1,7 @@ address?->number, $user?->address?->addressLine1, $user?->address?->addressLine2 - ] + ], + escape: '' ); fclose($fp); diff --git a/exercises/have-the-last-say/problem/problem.md b/exercises/have-the-last-say/problem/problem.md index 3835739..cf1f109 100644 --- a/exercises/have-the-last-say/problem/problem.md +++ b/exercises/have-the-last-say/problem/problem.md @@ -47,6 +47,8 @@ You will need to open the file for writing before using `fgetcsv` you can do tha `fgetcsv` will return *one* line at a time +On PHP 8.4+ you must also pass the `escape` argument (as a named argument, e.g. `escape: ""`) to avoid a deprecation notice. This is the only extra argument allowed. + You will most likely need a loop to process all the data in the file. You will need to keep reading from the file until it has been fully read. `feof` is your friend here and will inform you whether there is any data left to read. diff --git a/exercises/have-the-last-say/solution/solution.php b/exercises/have-the-last-say/solution/solution.php index 001d6f7..e138976 100644 --- a/exercises/have-the-last-say/solution/solution.php +++ b/exercises/have-the-last-say/solution/solution.php @@ -3,7 +3,7 @@ $fp = fopen($argv[1], 'r'); while (!feof($fp)) { - $row = fgetcsv($fp, separator: "|"); + $row = fgetcsv($fp, separator: "|", escape: ""); echo "Country: {$row[0]}, Capital: {$row[1]}\n"; } diff --git a/exercises/lord-of-the-strings/solution/composer.json b/exercises/lord-of-the-strings/solution/composer.json index 6a458d2..3b22ace 100644 --- a/exercises/lord-of-the-strings/solution/composer.json +++ b/exercises/lord-of-the-strings/solution/composer.json @@ -2,6 +2,6 @@ "name": "php8-appreciate/lord-of-the-strings", "description": "String manipulation with Composer", "require": { - "symfony/console": "^5" + "symfony/console": "^7.4" } } \ No newline at end of file diff --git a/exercises/lord-of-the-strings/solution/composer.lock b/exercises/lord-of-the-strings/solution/composer.lock index 064427b..4d6403c 100644 --- a/exercises/lord-of-the-strings/solution/composer.lock +++ b/exercises/lord-of-the-strings/solution/composer.lock @@ -4,26 +4,31 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "6ac4795b30973a813568017479251483", + "content-hash": "11d097b3ebdbba199d909816c7de2325", "packages": [ { "name": "psr/container", - "version": "1.1.1", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", "shasum": "" }, "require": { - "php": ">=7.2.0" + "php": ">=7.4.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, "autoload": { "psr-4": { "Psr\\Container\\": "src/" @@ -50,57 +55,53 @@ ], "support": { "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.1" + "source": "https://github.com/php-fig/container/tree/2.0.2" }, - "time": "2021-03-05T17:36:06+00:00" + "time": "2021-11-05T16:47:00+00:00" }, { "name": "symfony/console", - "version": "v5.3.0", + "version": "v7.4.21", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "058553870f7809087fa80fa734704a21b9bcaeb2" + "reference": "21f1bc2296f7ff6043241a8dcbc09559b3732820" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/058553870f7809087fa80fa734704a21b9bcaeb2", - "reference": "058553870f7809087fa80fa734704a21b9bcaeb2", + "url": "https://api.github.com/repos/symfony/console/zipball/21f1bc2296f7ff6043241a8dcbc09559b3732820", + "reference": "21f1bc2296f7ff6043241a8dcbc09559b3732820", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", - "symfony/polyfill-php80": "^1.15", - "symfony/service-contracts": "^1.1|^2", - "symfony/string": "^5.1" + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^7.2|^8.0" }, "conflict": { - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", - "symfony/lock": "<4.4", - "symfony/process": "<4.4" + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" }, "provide": { - "psr/log-implementation": "1.0" + "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { - "psr/log": "~1.0", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/event-dispatcher": "^4.4|^5.0", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", - "symfony/var-dumper": "^4.4|^5.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/lock": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -129,12 +130,12 @@ "homepage": "https://symfony.com", "keywords": [ "cli", - "command line", + "command-line", "console", "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.3.0" + "source": "https://github.com/symfony/console/tree/v7.4.21" }, "funding": [ { @@ -145,38 +146,42 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2026-10-12T18:45:38+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v2.4.0", + "version": "v3.7.1", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" + "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/f3202fa1b5097b0af062dc978b32ecf63404e31d", + "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.1" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "2.4-dev" - }, "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.7-dev" } }, "autoload": { @@ -201,7 +206,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.7.1" }, "funding": [ { @@ -212,50 +217,54 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2021-03-23T23:28:01+00:00" + "time": "2026-06-05T06:23:12+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.23.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" + "reference": "141046a8f9477948ff284fa65be2095baafb94f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" }, "suggest": { "ext-ctype": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -280,7 +289,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.37.0" }, "funding": [ { @@ -291,50 +300,51 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2026-04-10T16:19:22+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.23.0", + "version": "v1.43.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "24b72c6baa32c746a4d0840147c9715e42bb68ab" + "reference": "5cac8f4db97208823aa353f59a01faad2da52c75" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/24b72c6baa32c746a4d0840147c9715e42bb68ab", - "reference": "24b72c6baa32c746a4d0840147c9715e42bb68ab", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/5cac8f4db97208823aa353f59a01faad2da52c75", + "reference": "5cac8f4db97208823aa353f59a01faad2da52c75", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -361,7 +371,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.43.0" }, "funding": [ { @@ -372,50 +382,51 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2021-05-27T09:17:38+00:00" + "time": "2026-09-25T15:46:47+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.23.0", + "version": "v1.43.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + "reference": "ebd57ccc7edb93d632e184efbe7693d2517bab3b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/ebd57ccc7edb93d632e184efbe7693d2517bab3b", + "reference": "ebd57ccc7edb93d632e184efbe7693d2517bab3b", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, "files": [ "bootstrap.php" ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, "classmap": [ "Resources/stubs" ] @@ -445,7 +456,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.43.0" }, "funding": [ { @@ -456,50 +467,55 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2026-09-23T22:02:09+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.23.0", + "version": "v1.43.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1" + "reference": "4d5d331bf731e0aedbc6b2f5e61135b7b7996a72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2df51500adbaebdc4c38dea4c89a2e131c45c8a1", - "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/4d5d331bf731e0aedbc6b2f5e61135b7b7996a72", + "reference": "4d5d331bf731e0aedbc6b2f5e61135b7b7996a72", "shasum": "" }, "require": { - "php": ">=7.1" + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" }, "suggest": { "ext-mbstring": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -525,7 +541,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.43.0" }, "funding": [ { @@ -537,165 +553,7 @@ "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-05-27T09:27:20+00:00" - }, - { - "name": "symfony/polyfill-php73", - "version": "v1.23.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "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.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.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": "2021-02-19T12:13:01+00:00" - }, - { - "name": "symfony/polyfill-php80", - "version": "v1.23.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/eca0bf41ed421bed1b57c4958bab16aa86b757d0", - "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/nicolas-grekas", "type": "github" }, { @@ -703,43 +561,47 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2026-09-24T15:19:04+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.4.0", + "version": "v3.7.3", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" + "reference": "15e6a07ec2a2c75ceb1b21dd98105ee8456d2257" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", - "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/15e6a07ec2a2c75ceb1b21dd98105ee8456d2257", + "reference": "15e6a07ec2a2c75ceb1b21dd98105ee8456d2257", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/container": "^1.1" + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" }, - "suggest": { - "symfony/service-implementation": "" + "conflict": { + "ext-psr": "<1.1|>=2" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "2.4-dev" - }, "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.7-dev" } }, "autoload": { "psr-4": { "Symfony\\Contracts\\Service\\": "" - } + }, + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -766,7 +628,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" + "source": "https://github.com/symfony/service-contracts/tree/v3.7.3" }, "funding": [ { @@ -777,49 +639,56 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2021-04-01T10:43:52+00:00" + "time": "2026-07-27T15:39:01+00:00" }, { "name": "symfony/string", - "version": "v5.3.0", + "version": "v8.1.9", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "a9a0f8b6aafc5d2d1c116dcccd1573a95153515b" + "reference": "07fb208558f941eab50ec49c89c2a6a93fb11f01" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/a9a0f8b6aafc5d2d1c116dcccd1573a95153515b", - "reference": "a9a0f8b6aafc5d2d1c116dcccd1573a95153515b", + "url": "https://api.github.com/repos/symfony/string/zipball/07fb208558f941eab50ec49c89c2a6a93fb11f01", + "reference": "07fb208558f941eab50ec49c89c2a6a93fb11f01", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" + "php": ">=8.4.1", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-intl-grapheme": "^1.33", + "symfony/polyfill-intl-normalizer": "^1.0", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/error-handler": "^4.4|^5.0", - "symfony/http-client": "^4.4|^5.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0" + "symfony/emoji": "^7.4|^8.0", + "symfony/http-client": "^7.4|^8.0", + "symfony/intl": "^7.4|^8.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^7.4|^8.0" }, "type": "library", "autoload": { - "psr-4": { - "Symfony\\Component\\String\\": "" - }, "files": [ "Resources/functions.php" ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, "exclude-from-classmap": [ "/Tests/" ] @@ -849,7 +718,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.3.0" + "source": "https://github.com/symfony/string/tree/v8.1.9" }, "funding": [ { @@ -860,21 +729,25 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2026-10-03T15:16:03+00:00" } ], "packages-dev": [], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": {}, "prefer-stable": false, "prefer-lowest": false, - "platform": [], - "platform-dev": [], - "plugin-api-version": "2.0.0" + "platform": {}, + "platform-dev": {}, + "plugin-api-version": "2.9.0" } diff --git a/test/solutions/a-safe-space-for-nulls/correct-solution.php b/test/solutions/a-safe-space-for-nulls/correct-solution.php index 3ff9a55..3facf4e 100644 --- a/test/solutions/a-safe-space-for-nulls/correct-solution.php +++ b/test/solutions/a-safe-space-for-nulls/correct-solution.php @@ -1,6 +1,6 @@ firstName, $user->lastName, $user?->age, $user?->address?->number, $user?->address?->addressLine1, $user?->address?->addressLine2]); +fputcsv($fp, ['First Name', 'Last Name', 'Age', 'House num', 'Addr 1', 'Addr 2'], escape: ''); +fputcsv($fp, [$user->firstName, $user->lastName, $user?->age, $user?->address?->number, $user?->address?->addressLine1, $user?->address?->addressLine2], escape: ''); fclose($fp); diff --git a/test/solutions/a-safe-space-for-nulls/csv-wrong.php b/test/solutions/a-safe-space-for-nulls/csv-wrong.php index 66da0d4..e5a4cfc 100644 --- a/test/solutions/a-safe-space-for-nulls/csv-wrong.php +++ b/test/solutions/a-safe-space-for-nulls/csv-wrong.php @@ -1,6 +1,6 @@ firstName, $user->lastName, $user?->age, $user?->address?->number, $user?->address?->addressLine1, $user?->address?->addressLine2]); +fputcsv($fp, ['Wrong column', 'Last Name', 'Age', 'House num', 'Addr 1', 'Addr 2'], escape: ''); +fputcsv($fp, [$user->firstName, $user->lastName, $user?->age, $user?->address?->number, $user?->address?->addressLine1, $user?->address?->addressLine2], escape: ''); fclose($fp); diff --git a/test/solutions/have-the-last-say/solution-correct.php b/test/solutions/have-the-last-say/solution-correct.php index d48a90a..5e6698b 100644 --- a/test/solutions/have-the-last-say/solution-correct.php +++ b/test/solutions/have-the-last-say/solution-correct.php @@ -3,6 +3,6 @@ $fp = fopen($argv[1], 'r'); while (!feof($fp)) { - $row = fgetcsv($fp, separator: "|"); + $row = fgetcsv($fp, separator: "|", escape: ""); echo "Country: {$row[0]}, Capital: {$row[1]}\n"; } diff --git a/test/solutions/have-the-last-say/solution-no-stream-arg.php b/test/solutions/have-the-last-say/solution-no-stream-arg.php index dafe4e8..211fa3f 100644 --- a/test/solutions/have-the-last-say/solution-no-stream-arg.php +++ b/test/solutions/have-the-last-say/solution-no-stream-arg.php @@ -3,6 +3,6 @@ $fp = fopen($argv[1], 'r'); while (!feof($fp)) { - $row = fgetcsv(separator: "|"); + $row = fgetcsv(separator: "|", escape: ""); echo "Country: {$row[0]}, Capital: {$row[1]}\n"; } diff --git a/test/solutions/have-the-last-say/solution-wrong-output.php b/test/solutions/have-the-last-say/solution-wrong-output.php index a99cb6b..426481f 100644 --- a/test/solutions/have-the-last-say/solution-wrong-output.php +++ b/test/solutions/have-the-last-say/solution-wrong-output.php @@ -3,6 +3,6 @@ $fp = fopen($argv[1], 'r'); while (!feof($fp)) { - $row = fgetcsv($fp, separator: "|"); + $row = fgetcsv($fp, separator: "|", escape: ""); echo "Capital: {$row[0]}, Country: {$row[1]}\n"; } diff --git a/test/solutions/lord-of-the-strings/banned-functions/composer.json b/test/solutions/lord-of-the-strings/banned-functions/composer.json index 6a458d2..3b22ace 100644 --- a/test/solutions/lord-of-the-strings/banned-functions/composer.json +++ b/test/solutions/lord-of-the-strings/banned-functions/composer.json @@ -2,6 +2,6 @@ "name": "php8-appreciate/lord-of-the-strings", "description": "String manipulation with Composer", "require": { - "symfony/console": "^5" + "symfony/console": "^7.4" } } \ No newline at end of file diff --git a/test/solutions/lord-of-the-strings/banned-functions/composer.lock b/test/solutions/lord-of-the-strings/banned-functions/composer.lock index 064427b..4d6403c 100644 --- a/test/solutions/lord-of-the-strings/banned-functions/composer.lock +++ b/test/solutions/lord-of-the-strings/banned-functions/composer.lock @@ -4,26 +4,31 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "6ac4795b30973a813568017479251483", + "content-hash": "11d097b3ebdbba199d909816c7de2325", "packages": [ { "name": "psr/container", - "version": "1.1.1", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", "shasum": "" }, "require": { - "php": ">=7.2.0" + "php": ">=7.4.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, "autoload": { "psr-4": { "Psr\\Container\\": "src/" @@ -50,57 +55,53 @@ ], "support": { "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.1" + "source": "https://github.com/php-fig/container/tree/2.0.2" }, - "time": "2021-03-05T17:36:06+00:00" + "time": "2021-11-05T16:47:00+00:00" }, { "name": "symfony/console", - "version": "v5.3.0", + "version": "v7.4.21", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "058553870f7809087fa80fa734704a21b9bcaeb2" + "reference": "21f1bc2296f7ff6043241a8dcbc09559b3732820" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/058553870f7809087fa80fa734704a21b9bcaeb2", - "reference": "058553870f7809087fa80fa734704a21b9bcaeb2", + "url": "https://api.github.com/repos/symfony/console/zipball/21f1bc2296f7ff6043241a8dcbc09559b3732820", + "reference": "21f1bc2296f7ff6043241a8dcbc09559b3732820", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", - "symfony/polyfill-php80": "^1.15", - "symfony/service-contracts": "^1.1|^2", - "symfony/string": "^5.1" + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^7.2|^8.0" }, "conflict": { - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", - "symfony/lock": "<4.4", - "symfony/process": "<4.4" + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" }, "provide": { - "psr/log-implementation": "1.0" + "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { - "psr/log": "~1.0", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/event-dispatcher": "^4.4|^5.0", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", - "symfony/var-dumper": "^4.4|^5.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/lock": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -129,12 +130,12 @@ "homepage": "https://symfony.com", "keywords": [ "cli", - "command line", + "command-line", "console", "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.3.0" + "source": "https://github.com/symfony/console/tree/v7.4.21" }, "funding": [ { @@ -145,38 +146,42 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2026-10-12T18:45:38+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v2.4.0", + "version": "v3.7.1", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" + "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/f3202fa1b5097b0af062dc978b32ecf63404e31d", + "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.1" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "2.4-dev" - }, "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.7-dev" } }, "autoload": { @@ -201,7 +206,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.7.1" }, "funding": [ { @@ -212,50 +217,54 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2021-03-23T23:28:01+00:00" + "time": "2026-06-05T06:23:12+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.23.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" + "reference": "141046a8f9477948ff284fa65be2095baafb94f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" }, "suggest": { "ext-ctype": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -280,7 +289,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.37.0" }, "funding": [ { @@ -291,50 +300,51 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2026-04-10T16:19:22+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.23.0", + "version": "v1.43.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "24b72c6baa32c746a4d0840147c9715e42bb68ab" + "reference": "5cac8f4db97208823aa353f59a01faad2da52c75" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/24b72c6baa32c746a4d0840147c9715e42bb68ab", - "reference": "24b72c6baa32c746a4d0840147c9715e42bb68ab", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/5cac8f4db97208823aa353f59a01faad2da52c75", + "reference": "5cac8f4db97208823aa353f59a01faad2da52c75", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -361,7 +371,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.43.0" }, "funding": [ { @@ -372,50 +382,51 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2021-05-27T09:17:38+00:00" + "time": "2026-09-25T15:46:47+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.23.0", + "version": "v1.43.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + "reference": "ebd57ccc7edb93d632e184efbe7693d2517bab3b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/ebd57ccc7edb93d632e184efbe7693d2517bab3b", + "reference": "ebd57ccc7edb93d632e184efbe7693d2517bab3b", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, "files": [ "bootstrap.php" ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, "classmap": [ "Resources/stubs" ] @@ -445,7 +456,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.43.0" }, "funding": [ { @@ -456,50 +467,55 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2026-09-23T22:02:09+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.23.0", + "version": "v1.43.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1" + "reference": "4d5d331bf731e0aedbc6b2f5e61135b7b7996a72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2df51500adbaebdc4c38dea4c89a2e131c45c8a1", - "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/4d5d331bf731e0aedbc6b2f5e61135b7b7996a72", + "reference": "4d5d331bf731e0aedbc6b2f5e61135b7b7996a72", "shasum": "" }, "require": { - "php": ">=7.1" + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" }, "suggest": { "ext-mbstring": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -525,7 +541,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.43.0" }, "funding": [ { @@ -537,165 +553,7 @@ "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-05-27T09:27:20+00:00" - }, - { - "name": "symfony/polyfill-php73", - "version": "v1.23.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "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.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.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": "2021-02-19T12:13:01+00:00" - }, - { - "name": "symfony/polyfill-php80", - "version": "v1.23.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/eca0bf41ed421bed1b57c4958bab16aa86b757d0", - "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/nicolas-grekas", "type": "github" }, { @@ -703,43 +561,47 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2026-09-24T15:19:04+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.4.0", + "version": "v3.7.3", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" + "reference": "15e6a07ec2a2c75ceb1b21dd98105ee8456d2257" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", - "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/15e6a07ec2a2c75ceb1b21dd98105ee8456d2257", + "reference": "15e6a07ec2a2c75ceb1b21dd98105ee8456d2257", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/container": "^1.1" + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" }, - "suggest": { - "symfony/service-implementation": "" + "conflict": { + "ext-psr": "<1.1|>=2" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "2.4-dev" - }, "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.7-dev" } }, "autoload": { "psr-4": { "Symfony\\Contracts\\Service\\": "" - } + }, + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -766,7 +628,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" + "source": "https://github.com/symfony/service-contracts/tree/v3.7.3" }, "funding": [ { @@ -777,49 +639,56 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2021-04-01T10:43:52+00:00" + "time": "2026-07-27T15:39:01+00:00" }, { "name": "symfony/string", - "version": "v5.3.0", + "version": "v8.1.9", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "a9a0f8b6aafc5d2d1c116dcccd1573a95153515b" + "reference": "07fb208558f941eab50ec49c89c2a6a93fb11f01" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/a9a0f8b6aafc5d2d1c116dcccd1573a95153515b", - "reference": "a9a0f8b6aafc5d2d1c116dcccd1573a95153515b", + "url": "https://api.github.com/repos/symfony/string/zipball/07fb208558f941eab50ec49c89c2a6a93fb11f01", + "reference": "07fb208558f941eab50ec49c89c2a6a93fb11f01", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" + "php": ">=8.4.1", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-intl-grapheme": "^1.33", + "symfony/polyfill-intl-normalizer": "^1.0", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/error-handler": "^4.4|^5.0", - "symfony/http-client": "^4.4|^5.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0" + "symfony/emoji": "^7.4|^8.0", + "symfony/http-client": "^7.4|^8.0", + "symfony/intl": "^7.4|^8.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^7.4|^8.0" }, "type": "library", "autoload": { - "psr-4": { - "Symfony\\Component\\String\\": "" - }, "files": [ "Resources/functions.php" ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, "exclude-from-classmap": [ "/Tests/" ] @@ -849,7 +718,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.3.0" + "source": "https://github.com/symfony/string/tree/v8.1.9" }, "funding": [ { @@ -860,21 +729,25 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2026-10-03T15:16:03+00:00" } ], "packages-dev": [], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": {}, "prefer-stable": false, "prefer-lowest": false, - "platform": [], - "platform-dev": [], - "plugin-api-version": "2.0.0" + "platform": {}, + "platform-dev": {}, + "plugin-api-version": "2.9.0" } diff --git a/test/solutions/lord-of-the-strings/correct-solution/composer.json b/test/solutions/lord-of-the-strings/correct-solution/composer.json index 6a458d2..3b22ace 100644 --- a/test/solutions/lord-of-the-strings/correct-solution/composer.json +++ b/test/solutions/lord-of-the-strings/correct-solution/composer.json @@ -2,6 +2,6 @@ "name": "php8-appreciate/lord-of-the-strings", "description": "String manipulation with Composer", "require": { - "symfony/console": "^5" + "symfony/console": "^7.4" } } \ No newline at end of file diff --git a/test/solutions/lord-of-the-strings/correct-solution/composer.lock b/test/solutions/lord-of-the-strings/correct-solution/composer.lock index 064427b..4d6403c 100644 --- a/test/solutions/lord-of-the-strings/correct-solution/composer.lock +++ b/test/solutions/lord-of-the-strings/correct-solution/composer.lock @@ -4,26 +4,31 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "6ac4795b30973a813568017479251483", + "content-hash": "11d097b3ebdbba199d909816c7de2325", "packages": [ { "name": "psr/container", - "version": "1.1.1", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", "shasum": "" }, "require": { - "php": ">=7.2.0" + "php": ">=7.4.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, "autoload": { "psr-4": { "Psr\\Container\\": "src/" @@ -50,57 +55,53 @@ ], "support": { "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.1" + "source": "https://github.com/php-fig/container/tree/2.0.2" }, - "time": "2021-03-05T17:36:06+00:00" + "time": "2021-11-05T16:47:00+00:00" }, { "name": "symfony/console", - "version": "v5.3.0", + "version": "v7.4.21", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "058553870f7809087fa80fa734704a21b9bcaeb2" + "reference": "21f1bc2296f7ff6043241a8dcbc09559b3732820" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/058553870f7809087fa80fa734704a21b9bcaeb2", - "reference": "058553870f7809087fa80fa734704a21b9bcaeb2", + "url": "https://api.github.com/repos/symfony/console/zipball/21f1bc2296f7ff6043241a8dcbc09559b3732820", + "reference": "21f1bc2296f7ff6043241a8dcbc09559b3732820", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", - "symfony/polyfill-php80": "^1.15", - "symfony/service-contracts": "^1.1|^2", - "symfony/string": "^5.1" + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^7.2|^8.0" }, "conflict": { - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", - "symfony/lock": "<4.4", - "symfony/process": "<4.4" + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" }, "provide": { - "psr/log-implementation": "1.0" + "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { - "psr/log": "~1.0", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/event-dispatcher": "^4.4|^5.0", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", - "symfony/var-dumper": "^4.4|^5.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/lock": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -129,12 +130,12 @@ "homepage": "https://symfony.com", "keywords": [ "cli", - "command line", + "command-line", "console", "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.3.0" + "source": "https://github.com/symfony/console/tree/v7.4.21" }, "funding": [ { @@ -145,38 +146,42 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2026-10-12T18:45:38+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v2.4.0", + "version": "v3.7.1", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" + "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/f3202fa1b5097b0af062dc978b32ecf63404e31d", + "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.1" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "2.4-dev" - }, "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.7-dev" } }, "autoload": { @@ -201,7 +206,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.7.1" }, "funding": [ { @@ -212,50 +217,54 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2021-03-23T23:28:01+00:00" + "time": "2026-06-05T06:23:12+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.23.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" + "reference": "141046a8f9477948ff284fa65be2095baafb94f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" }, "suggest": { "ext-ctype": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -280,7 +289,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.37.0" }, "funding": [ { @@ -291,50 +300,51 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2026-04-10T16:19:22+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.23.0", + "version": "v1.43.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "24b72c6baa32c746a4d0840147c9715e42bb68ab" + "reference": "5cac8f4db97208823aa353f59a01faad2da52c75" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/24b72c6baa32c746a4d0840147c9715e42bb68ab", - "reference": "24b72c6baa32c746a4d0840147c9715e42bb68ab", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/5cac8f4db97208823aa353f59a01faad2da52c75", + "reference": "5cac8f4db97208823aa353f59a01faad2da52c75", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -361,7 +371,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.43.0" }, "funding": [ { @@ -372,50 +382,51 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2021-05-27T09:17:38+00:00" + "time": "2026-09-25T15:46:47+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.23.0", + "version": "v1.43.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + "reference": "ebd57ccc7edb93d632e184efbe7693d2517bab3b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/ebd57ccc7edb93d632e184efbe7693d2517bab3b", + "reference": "ebd57ccc7edb93d632e184efbe7693d2517bab3b", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, "files": [ "bootstrap.php" ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, "classmap": [ "Resources/stubs" ] @@ -445,7 +456,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.43.0" }, "funding": [ { @@ -456,50 +467,55 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2026-09-23T22:02:09+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.23.0", + "version": "v1.43.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1" + "reference": "4d5d331bf731e0aedbc6b2f5e61135b7b7996a72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2df51500adbaebdc4c38dea4c89a2e131c45c8a1", - "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/4d5d331bf731e0aedbc6b2f5e61135b7b7996a72", + "reference": "4d5d331bf731e0aedbc6b2f5e61135b7b7996a72", "shasum": "" }, "require": { - "php": ">=7.1" + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" }, "suggest": { "ext-mbstring": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -525,7 +541,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.43.0" }, "funding": [ { @@ -537,165 +553,7 @@ "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-05-27T09:27:20+00:00" - }, - { - "name": "symfony/polyfill-php73", - "version": "v1.23.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "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.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.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": "2021-02-19T12:13:01+00:00" - }, - { - "name": "symfony/polyfill-php80", - "version": "v1.23.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/eca0bf41ed421bed1b57c4958bab16aa86b757d0", - "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/nicolas-grekas", "type": "github" }, { @@ -703,43 +561,47 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2026-09-24T15:19:04+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.4.0", + "version": "v3.7.3", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" + "reference": "15e6a07ec2a2c75ceb1b21dd98105ee8456d2257" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", - "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/15e6a07ec2a2c75ceb1b21dd98105ee8456d2257", + "reference": "15e6a07ec2a2c75ceb1b21dd98105ee8456d2257", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/container": "^1.1" + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" }, - "suggest": { - "symfony/service-implementation": "" + "conflict": { + "ext-psr": "<1.1|>=2" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "2.4-dev" - }, "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.7-dev" } }, "autoload": { "psr-4": { "Symfony\\Contracts\\Service\\": "" - } + }, + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -766,7 +628,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" + "source": "https://github.com/symfony/service-contracts/tree/v3.7.3" }, "funding": [ { @@ -777,49 +639,56 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2021-04-01T10:43:52+00:00" + "time": "2026-07-27T15:39:01+00:00" }, { "name": "symfony/string", - "version": "v5.3.0", + "version": "v8.1.9", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "a9a0f8b6aafc5d2d1c116dcccd1573a95153515b" + "reference": "07fb208558f941eab50ec49c89c2a6a93fb11f01" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/a9a0f8b6aafc5d2d1c116dcccd1573a95153515b", - "reference": "a9a0f8b6aafc5d2d1c116dcccd1573a95153515b", + "url": "https://api.github.com/repos/symfony/string/zipball/07fb208558f941eab50ec49c89c2a6a93fb11f01", + "reference": "07fb208558f941eab50ec49c89c2a6a93fb11f01", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" + "php": ">=8.4.1", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-intl-grapheme": "^1.33", + "symfony/polyfill-intl-normalizer": "^1.0", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/error-handler": "^4.4|^5.0", - "symfony/http-client": "^4.4|^5.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0" + "symfony/emoji": "^7.4|^8.0", + "symfony/http-client": "^7.4|^8.0", + "symfony/intl": "^7.4|^8.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^7.4|^8.0" }, "type": "library", "autoload": { - "psr-4": { - "Symfony\\Component\\String\\": "" - }, "files": [ "Resources/functions.php" ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, "exclude-from-classmap": [ "/Tests/" ] @@ -849,7 +718,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.3.0" + "source": "https://github.com/symfony/string/tree/v8.1.9" }, "funding": [ { @@ -860,21 +729,25 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2026-10-03T15:16:03+00:00" } ], "packages-dev": [], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": {}, "prefer-stable": false, "prefer-lowest": false, - "platform": [], - "platform-dev": [], - "plugin-api-version": "2.0.0" + "platform": {}, + "platform-dev": {}, + "plugin-api-version": "2.9.0" } diff --git a/test/solutions/lord-of-the-strings/no-code/composer.json b/test/solutions/lord-of-the-strings/no-code/composer.json index 6a458d2..3b22ace 100644 --- a/test/solutions/lord-of-the-strings/no-code/composer.json +++ b/test/solutions/lord-of-the-strings/no-code/composer.json @@ -2,6 +2,6 @@ "name": "php8-appreciate/lord-of-the-strings", "description": "String manipulation with Composer", "require": { - "symfony/console": "^5" + "symfony/console": "^7.4" } } \ No newline at end of file diff --git a/test/solutions/lord-of-the-strings/no-code/composer.lock b/test/solutions/lord-of-the-strings/no-code/composer.lock index 064427b..4d6403c 100644 --- a/test/solutions/lord-of-the-strings/no-code/composer.lock +++ b/test/solutions/lord-of-the-strings/no-code/composer.lock @@ -4,26 +4,31 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "6ac4795b30973a813568017479251483", + "content-hash": "11d097b3ebdbba199d909816c7de2325", "packages": [ { "name": "psr/container", - "version": "1.1.1", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", "shasum": "" }, "require": { - "php": ">=7.2.0" + "php": ">=7.4.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, "autoload": { "psr-4": { "Psr\\Container\\": "src/" @@ -50,57 +55,53 @@ ], "support": { "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.1" + "source": "https://github.com/php-fig/container/tree/2.0.2" }, - "time": "2021-03-05T17:36:06+00:00" + "time": "2021-11-05T16:47:00+00:00" }, { "name": "symfony/console", - "version": "v5.3.0", + "version": "v7.4.21", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "058553870f7809087fa80fa734704a21b9bcaeb2" + "reference": "21f1bc2296f7ff6043241a8dcbc09559b3732820" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/058553870f7809087fa80fa734704a21b9bcaeb2", - "reference": "058553870f7809087fa80fa734704a21b9bcaeb2", + "url": "https://api.github.com/repos/symfony/console/zipball/21f1bc2296f7ff6043241a8dcbc09559b3732820", + "reference": "21f1bc2296f7ff6043241a8dcbc09559b3732820", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", - "symfony/polyfill-php80": "^1.15", - "symfony/service-contracts": "^1.1|^2", - "symfony/string": "^5.1" + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^7.2|^8.0" }, "conflict": { - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", - "symfony/lock": "<4.4", - "symfony/process": "<4.4" + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" }, "provide": { - "psr/log-implementation": "1.0" + "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { - "psr/log": "~1.0", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/event-dispatcher": "^4.4|^5.0", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", - "symfony/var-dumper": "^4.4|^5.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/event-dispatcher": "^6.4|^7.0|^8.0", + "symfony/http-foundation": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/lock": "^6.4|^7.0|^8.0", + "symfony/messenger": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0", + "symfony/stopwatch": "^6.4|^7.0|^8.0", + "symfony/var-dumper": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -129,12 +130,12 @@ "homepage": "https://symfony.com", "keywords": [ "cli", - "command line", + "command-line", "console", "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.3.0" + "source": "https://github.com/symfony/console/tree/v7.4.21" }, "funding": [ { @@ -145,38 +146,42 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2026-10-12T18:45:38+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v2.4.0", + "version": "v3.7.1", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" + "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/f3202fa1b5097b0af062dc978b32ecf63404e31d", + "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.1" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "2.4-dev" - }, "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.7-dev" } }, "autoload": { @@ -201,7 +206,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.7.1" }, "funding": [ { @@ -212,50 +217,54 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2021-03-23T23:28:01+00:00" + "time": "2026-06-05T06:23:12+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.23.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" + "reference": "141046a8f9477948ff284fa65be2095baafb94f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" }, "suggest": { "ext-ctype": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -280,7 +289,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.37.0" }, "funding": [ { @@ -291,50 +300,51 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2026-04-10T16:19:22+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.23.0", + "version": "v1.43.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "24b72c6baa32c746a4d0840147c9715e42bb68ab" + "reference": "5cac8f4db97208823aa353f59a01faad2da52c75" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/24b72c6baa32c746a4d0840147c9715e42bb68ab", - "reference": "24b72c6baa32c746a4d0840147c9715e42bb68ab", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/5cac8f4db97208823aa353f59a01faad2da52c75", + "reference": "5cac8f4db97208823aa353f59a01faad2da52c75", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -361,7 +371,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.43.0" }, "funding": [ { @@ -372,50 +382,51 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2021-05-27T09:17:38+00:00" + "time": "2026-09-25T15:46:47+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.23.0", + "version": "v1.43.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + "reference": "ebd57ccc7edb93d632e184efbe7693d2517bab3b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/ebd57ccc7edb93d632e184efbe7693d2517bab3b", + "reference": "ebd57ccc7edb93d632e184efbe7693d2517bab3b", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "suggest": { "ext-intl": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, "files": [ "bootstrap.php" ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, "classmap": [ "Resources/stubs" ] @@ -445,7 +456,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.43.0" }, "funding": [ { @@ -456,50 +467,55 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2026-09-23T22:02:09+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.23.0", + "version": "v1.43.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1" + "reference": "4d5d331bf731e0aedbc6b2f5e61135b7b7996a72" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/2df51500adbaebdc4c38dea4c89a2e131c45c8a1", - "reference": "2df51500adbaebdc4c38dea4c89a2e131c45c8a1", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/4d5d331bf731e0aedbc6b2f5e61135b7b7996a72", + "reference": "4d5d331bf731e0aedbc6b2f5e61135b7b7996a72", "shasum": "" }, "require": { - "php": ">=7.1" + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" }, "suggest": { "ext-mbstring": "For best performance" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - }, "files": [ "bootstrap.php" - ] + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -525,7 +541,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.43.0" }, "funding": [ { @@ -537,165 +553,7 @@ "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-05-27T09:27:20+00:00" - }, - { - "name": "symfony/polyfill-php73", - "version": "v1.23.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", - "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "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.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.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": "2021-02-19T12:13:01+00:00" - }, - { - "name": "symfony/polyfill-php80", - "version": "v1.23.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/eca0bf41ed421bed1b57c4958bab16aa86b757d0", - "reference": "eca0bf41ed421bed1b57c4958bab16aa86b757d0", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "files": [ - "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/nicolas-grekas", "type": "github" }, { @@ -703,43 +561,47 @@ "type": "tidelift" } ], - "time": "2021-02-19T12:13:01+00:00" + "time": "2026-09-24T15:19:04+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.4.0", + "version": "v3.7.3", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" + "reference": "15e6a07ec2a2c75ceb1b21dd98105ee8456d2257" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", - "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/15e6a07ec2a2c75ceb1b21dd98105ee8456d2257", + "reference": "15e6a07ec2a2c75ceb1b21dd98105ee8456d2257", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/container": "^1.1" + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" }, - "suggest": { - "symfony/service-implementation": "" + "conflict": { + "ext-psr": "<1.1|>=2" }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "2.4-dev" - }, "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.7-dev" } }, "autoload": { "psr-4": { "Symfony\\Contracts\\Service\\": "" - } + }, + "exclude-from-classmap": [ + "/Test/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -766,7 +628,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" + "source": "https://github.com/symfony/service-contracts/tree/v3.7.3" }, "funding": [ { @@ -777,49 +639,56 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2021-04-01T10:43:52+00:00" + "time": "2026-07-27T15:39:01+00:00" }, { "name": "symfony/string", - "version": "v5.3.0", + "version": "v8.1.9", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "a9a0f8b6aafc5d2d1c116dcccd1573a95153515b" + "reference": "07fb208558f941eab50ec49c89c2a6a93fb11f01" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/a9a0f8b6aafc5d2d1c116dcccd1573a95153515b", - "reference": "a9a0f8b6aafc5d2d1c116dcccd1573a95153515b", + "url": "https://api.github.com/repos/symfony/string/zipball/07fb208558f941eab50ec49c89c2a6a93fb11f01", + "reference": "07fb208558f941eab50ec49c89c2a6a93fb11f01", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" + "php": ">=8.4.1", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-intl-grapheme": "^1.33", + "symfony/polyfill-intl-normalizer": "^1.0", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/error-handler": "^4.4|^5.0", - "symfony/http-client": "^4.4|^5.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0" + "symfony/emoji": "^7.4|^8.0", + "symfony/http-client": "^7.4|^8.0", + "symfony/intl": "^7.4|^8.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^7.4|^8.0" }, "type": "library", "autoload": { - "psr-4": { - "Symfony\\Component\\String\\": "" - }, "files": [ "Resources/functions.php" ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, "exclude-from-classmap": [ "/Tests/" ] @@ -849,7 +718,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.3.0" + "source": "https://github.com/symfony/string/tree/v8.1.9" }, "funding": [ { @@ -860,21 +729,25 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2021-05-26T17:43:10+00:00" + "time": "2026-10-03T15:16:03+00:00" } ], "packages-dev": [], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": {}, "prefer-stable": false, "prefer-lowest": false, - "platform": [], - "platform-dev": [], - "plugin-api-version": "2.0.0" + "platform": {}, + "platform-dev": {}, + "plugin-api-version": "2.9.0" } From 2eecb01433d69c74311969657ff02318824c8969 Mon Sep 17 00:00:00 2001 From: Aydin Hassan Date: Thu, 22 Oct 2026 17:07:30 +0200 Subject: [PATCH 13/27] CI: test PHP 8.2-8.5, add timeout, phpunit --stop-on-error, drop coverage upload Co-Authored-By: Claude Opus 5.5 --- .github/workflows/build.yml | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d7a821d..ca0fea4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,12 +12,13 @@ jobs: strategy: fail-fast: false matrix: - php: [8.0, 8.1, 8.2, 8.3] + php: ['8.2', '8.3', '8.4', '8.5'] name: PHP ${{ matrix.php }} + timeout-minutes: 20 steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Setup PHP uses: shivammathur/setup-php@v2 @@ -33,8 +34,8 @@ jobs: - name: Run phpunit tests run: | mkdir -p build/logs - PROCESS_FACTORY=host vendor/bin/phpunit - PROCESS_FACTORY=docker vendor/bin/phpunit --coverage-clover ./build/logs/clover.xml + PROCESS_FACTORY=host vendor/bin/phpunit --stop-on-error + PROCESS_FACTORY=docker vendor/bin/phpunit --stop-on-error - name: Run phpcs run: composer cs @@ -56,7 +57,3 @@ jobs: chmod +x workshop-manager.phar ./workshop-manager.phar install php8appreciate master ./workshop-manager.phar installed - - - name: Coverage upload - if: matrix.php == '8.0' - run: bash <(curl -s https://codecov.io/bash) From 2adb95d9bcbe7837087bfccc39a627693d79c633 Mon Sep 17 00:00:00 2001 From: Aydin Hassan Date: Thu, 22 Oct 2026 17:09:02 +0200 Subject: [PATCH 14/27] Pin lord-of-the-strings solution deps to PHP 8.2 platform so they run on the 8.3 runtime image Co-Authored-By: Claude Opus 5.5 --- .../solution/composer.json | 7 +++- .../solution/composer.lock | 36 ++++++++++--------- .../banned-functions/composer.json | 7 +++- .../banned-functions/composer.lock | 36 ++++++++++--------- .../correct-solution/composer.json | 7 +++- .../correct-solution/composer.lock | 36 ++++++++++--------- .../lord-of-the-strings/no-code/composer.json | 7 +++- .../lord-of-the-strings/no-code/composer.lock | 36 ++++++++++--------- 8 files changed, 104 insertions(+), 68 deletions(-) diff --git a/exercises/lord-of-the-strings/solution/composer.json b/exercises/lord-of-the-strings/solution/composer.json index 3b22ace..1e30e38 100644 --- a/exercises/lord-of-the-strings/solution/composer.json +++ b/exercises/lord-of-the-strings/solution/composer.json @@ -3,5 +3,10 @@ "description": "String manipulation with Composer", "require": { "symfony/console": "^7.4" + }, + "config": { + "platform": { + "php": "8.2.0" + } } -} \ No newline at end of file +} diff --git a/exercises/lord-of-the-strings/solution/composer.lock b/exercises/lord-of-the-strings/solution/composer.lock index 4d6403c..ce34e8a 100644 --- a/exercises/lord-of-the-strings/solution/composer.lock +++ b/exercises/lord-of-the-strings/solution/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "11d097b3ebdbba199d909816c7de2325", + "content-hash": "cea4e1ae672d09313a1fd8fb98d25841", "packages": [ { "name": "psr/container", @@ -652,34 +652,35 @@ }, { "name": "symfony/string", - "version": "v8.1.9", + "version": "v7.4.21", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "07fb208558f941eab50ec49c89c2a6a93fb11f01" + "reference": "9bc35d074ad16a58c21cd52b18c5cacc4f4c3981" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/07fb208558f941eab50ec49c89c2a6a93fb11f01", - "reference": "07fb208558f941eab50ec49c89c2a6a93fb11f01", + "url": "https://api.github.com/repos/symfony/string/zipball/9bc35d074ad16a58c21cd52b18c5cacc4f4c3981", + "reference": "9bc35d074ad16a58c21cd52b18c5cacc4f4c3981", "shasum": "" }, "require": { - "php": ">=8.4.1", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-intl-grapheme": "^1.33", - "symfony/polyfill-intl-normalizer": "^1.0", - "symfony/polyfill-mbstring": "^1.0" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.33", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" }, "conflict": { "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/emoji": "^7.4|^8.0", - "symfony/http-client": "^7.4|^8.0", - "symfony/intl": "^7.4|^8.0", + "symfony/emoji": "^7.1|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^7.4|^8.0" + "symfony/var-exporter": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -718,7 +719,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v8.1.9" + "source": "https://github.com/symfony/string/tree/v7.4.21" }, "funding": [ { @@ -738,7 +739,7 @@ "type": "tidelift" } ], - "time": "2026-10-03T15:16:03+00:00" + "time": "2026-10-03T15:15:30+00:00" } ], "packages-dev": [], @@ -749,5 +750,8 @@ "prefer-lowest": false, "platform": {}, "platform-dev": {}, + "platform-overrides": { + "php": "8.2.0" + }, "plugin-api-version": "2.9.0" } diff --git a/test/solutions/lord-of-the-strings/banned-functions/composer.json b/test/solutions/lord-of-the-strings/banned-functions/composer.json index 3b22ace..1e30e38 100644 --- a/test/solutions/lord-of-the-strings/banned-functions/composer.json +++ b/test/solutions/lord-of-the-strings/banned-functions/composer.json @@ -3,5 +3,10 @@ "description": "String manipulation with Composer", "require": { "symfony/console": "^7.4" + }, + "config": { + "platform": { + "php": "8.2.0" + } } -} \ No newline at end of file +} diff --git a/test/solutions/lord-of-the-strings/banned-functions/composer.lock b/test/solutions/lord-of-the-strings/banned-functions/composer.lock index 4d6403c..ce34e8a 100644 --- a/test/solutions/lord-of-the-strings/banned-functions/composer.lock +++ b/test/solutions/lord-of-the-strings/banned-functions/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "11d097b3ebdbba199d909816c7de2325", + "content-hash": "cea4e1ae672d09313a1fd8fb98d25841", "packages": [ { "name": "psr/container", @@ -652,34 +652,35 @@ }, { "name": "symfony/string", - "version": "v8.1.9", + "version": "v7.4.21", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "07fb208558f941eab50ec49c89c2a6a93fb11f01" + "reference": "9bc35d074ad16a58c21cd52b18c5cacc4f4c3981" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/07fb208558f941eab50ec49c89c2a6a93fb11f01", - "reference": "07fb208558f941eab50ec49c89c2a6a93fb11f01", + "url": "https://api.github.com/repos/symfony/string/zipball/9bc35d074ad16a58c21cd52b18c5cacc4f4c3981", + "reference": "9bc35d074ad16a58c21cd52b18c5cacc4f4c3981", "shasum": "" }, "require": { - "php": ">=8.4.1", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-intl-grapheme": "^1.33", - "symfony/polyfill-intl-normalizer": "^1.0", - "symfony/polyfill-mbstring": "^1.0" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.33", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" }, "conflict": { "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/emoji": "^7.4|^8.0", - "symfony/http-client": "^7.4|^8.0", - "symfony/intl": "^7.4|^8.0", + "symfony/emoji": "^7.1|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^7.4|^8.0" + "symfony/var-exporter": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -718,7 +719,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v8.1.9" + "source": "https://github.com/symfony/string/tree/v7.4.21" }, "funding": [ { @@ -738,7 +739,7 @@ "type": "tidelift" } ], - "time": "2026-10-03T15:16:03+00:00" + "time": "2026-10-03T15:15:30+00:00" } ], "packages-dev": [], @@ -749,5 +750,8 @@ "prefer-lowest": false, "platform": {}, "platform-dev": {}, + "platform-overrides": { + "php": "8.2.0" + }, "plugin-api-version": "2.9.0" } diff --git a/test/solutions/lord-of-the-strings/correct-solution/composer.json b/test/solutions/lord-of-the-strings/correct-solution/composer.json index 3b22ace..1e30e38 100644 --- a/test/solutions/lord-of-the-strings/correct-solution/composer.json +++ b/test/solutions/lord-of-the-strings/correct-solution/composer.json @@ -3,5 +3,10 @@ "description": "String manipulation with Composer", "require": { "symfony/console": "^7.4" + }, + "config": { + "platform": { + "php": "8.2.0" + } } -} \ No newline at end of file +} diff --git a/test/solutions/lord-of-the-strings/correct-solution/composer.lock b/test/solutions/lord-of-the-strings/correct-solution/composer.lock index 4d6403c..ce34e8a 100644 --- a/test/solutions/lord-of-the-strings/correct-solution/composer.lock +++ b/test/solutions/lord-of-the-strings/correct-solution/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "11d097b3ebdbba199d909816c7de2325", + "content-hash": "cea4e1ae672d09313a1fd8fb98d25841", "packages": [ { "name": "psr/container", @@ -652,34 +652,35 @@ }, { "name": "symfony/string", - "version": "v8.1.9", + "version": "v7.4.21", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "07fb208558f941eab50ec49c89c2a6a93fb11f01" + "reference": "9bc35d074ad16a58c21cd52b18c5cacc4f4c3981" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/07fb208558f941eab50ec49c89c2a6a93fb11f01", - "reference": "07fb208558f941eab50ec49c89c2a6a93fb11f01", + "url": "https://api.github.com/repos/symfony/string/zipball/9bc35d074ad16a58c21cd52b18c5cacc4f4c3981", + "reference": "9bc35d074ad16a58c21cd52b18c5cacc4f4c3981", "shasum": "" }, "require": { - "php": ">=8.4.1", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-intl-grapheme": "^1.33", - "symfony/polyfill-intl-normalizer": "^1.0", - "symfony/polyfill-mbstring": "^1.0" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.33", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" }, "conflict": { "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/emoji": "^7.4|^8.0", - "symfony/http-client": "^7.4|^8.0", - "symfony/intl": "^7.4|^8.0", + "symfony/emoji": "^7.1|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^7.4|^8.0" + "symfony/var-exporter": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -718,7 +719,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v8.1.9" + "source": "https://github.com/symfony/string/tree/v7.4.21" }, "funding": [ { @@ -738,7 +739,7 @@ "type": "tidelift" } ], - "time": "2026-10-03T15:16:03+00:00" + "time": "2026-10-03T15:15:30+00:00" } ], "packages-dev": [], @@ -749,5 +750,8 @@ "prefer-lowest": false, "platform": {}, "platform-dev": {}, + "platform-overrides": { + "php": "8.2.0" + }, "plugin-api-version": "2.9.0" } diff --git a/test/solutions/lord-of-the-strings/no-code/composer.json b/test/solutions/lord-of-the-strings/no-code/composer.json index 3b22ace..1e30e38 100644 --- a/test/solutions/lord-of-the-strings/no-code/composer.json +++ b/test/solutions/lord-of-the-strings/no-code/composer.json @@ -3,5 +3,10 @@ "description": "String manipulation with Composer", "require": { "symfony/console": "^7.4" + }, + "config": { + "platform": { + "php": "8.2.0" + } } -} \ No newline at end of file +} diff --git a/test/solutions/lord-of-the-strings/no-code/composer.lock b/test/solutions/lord-of-the-strings/no-code/composer.lock index 4d6403c..ce34e8a 100644 --- a/test/solutions/lord-of-the-strings/no-code/composer.lock +++ b/test/solutions/lord-of-the-strings/no-code/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "11d097b3ebdbba199d909816c7de2325", + "content-hash": "cea4e1ae672d09313a1fd8fb98d25841", "packages": [ { "name": "psr/container", @@ -652,34 +652,35 @@ }, { "name": "symfony/string", - "version": "v8.1.9", + "version": "v7.4.21", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "07fb208558f941eab50ec49c89c2a6a93fb11f01" + "reference": "9bc35d074ad16a58c21cd52b18c5cacc4f4c3981" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/07fb208558f941eab50ec49c89c2a6a93fb11f01", - "reference": "07fb208558f941eab50ec49c89c2a6a93fb11f01", + "url": "https://api.github.com/repos/symfony/string/zipball/9bc35d074ad16a58c21cd52b18c5cacc4f4c3981", + "reference": "9bc35d074ad16a58c21cd52b18c5cacc4f4c3981", "shasum": "" }, "require": { - "php": ">=8.4.1", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-intl-grapheme": "^1.33", - "symfony/polyfill-intl-normalizer": "^1.0", - "symfony/polyfill-mbstring": "^1.0" + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.33", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" }, "conflict": { "symfony/translation-contracts": "<2.5" }, "require-dev": { - "symfony/emoji": "^7.4|^8.0", - "symfony/http-client": "^7.4|^8.0", - "symfony/intl": "^7.4|^8.0", + "symfony/emoji": "^7.1|^8.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/intl": "^6.4|^7.0|^8.0", "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^7.4|^8.0" + "symfony/var-exporter": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -718,7 +719,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v8.1.9" + "source": "https://github.com/symfony/string/tree/v7.4.21" }, "funding": [ { @@ -738,7 +739,7 @@ "type": "tidelift" } ], - "time": "2026-10-03T15:16:03+00:00" + "time": "2026-10-03T15:15:30+00:00" } ], "packages-dev": [], @@ -749,5 +750,8 @@ "prefer-lowest": false, "platform": {}, "platform-dev": {}, + "platform-overrides": { + "php": "8.2.0" + }, "plugin-api-version": "2.9.0" } From 619fed81f115231b9aaa7e0901f4f8295ee3919e Mon Sep 17 00:00:00 2001 From: Aydin Hassan Date: Thu, 22 Oct 2026 17:31:54 +0200 Subject: [PATCH 15/27] Update composer.lock against php-workshop docker-fixes Co-Authored-By: Claude Opus 5.5 --- composer.lock | 2053 ++++++++++++++++++++++++++++++------------------- 1 file changed, 1258 insertions(+), 795 deletions(-) diff --git a/composer.lock b/composer.lock index 695d33d..ba01afa 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "2d8b0aef87879a02fc704a8f524de907", + "content-hash": "e477df64354f1684dcb4a563642ee5e2", "packages": [ { "name": "beberlei/assert", - "version": "v3.3.2", + "version": "v3.3.4", "source": { "type": "git", "url": "https://github.com/beberlei/assert.git", - "reference": "cb70015c04be1baee6f5f5c953703347c0ac1655" + "reference": "f193f4613c7d7fbcee2c05e4daff4061d49c040e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/beberlei/assert/zipball/cb70015c04be1baee6f5f5c953703347c0ac1655", - "reference": "cb70015c04be1baee6f5f5c953703347c0ac1655", + "url": "https://api.github.com/repos/beberlei/assert/zipball/f193f4613c7d7fbcee2c05e4daff4061d49c040e", + "reference": "f193f4613c7d7fbcee2c05e4daff4061d49c040e", "shasum": "" }, "require": { @@ -25,7 +25,7 @@ "ext-json": "*", "ext-mbstring": "*", "ext-simplexml": "*", - "php": "^7.0 || ^8.0" + "php": "^7.1 || ^8.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "*", @@ -69,22 +69,97 @@ ], "support": { "issues": "https://github.com/beberlei/assert/issues", - "source": "https://github.com/beberlei/assert/tree/v3.3.2" + "source": "https://github.com/beberlei/assert/tree/v3.3.4" + }, + "time": "2026-06-10T19:47:05+00:00" + }, + { + "name": "dflydev/dot-access-data", + "version": "v3.0.3", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "reference": "a23a2bf4f31d3518f3ecb38660c95715dfead60f", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", + "scrutinizer/ocular": "1.6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Dflydev\\DotAccessData\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + }, + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" + } + ], + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.3" }, - "time": "2021-12-16T21:41:27+00:00" + "time": "2024-07-08T12:26:09+00:00" }, { "name": "fakerphp/faker", - "version": "v1.23.1", + "version": "v1.24.1", "source": { "type": "git", "url": "https://github.com/FakerPHP/Faker.git", - "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b" + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/bfb4fe148adbf78eff521199619b93a52ae3554b", - "reference": "bfb4fe148adbf78eff521199619b93a52ae3554b", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", + "reference": "e0ee18eb1e6dc3cda3ce9fd97e5a0689a88a64b5", "shasum": "" }, "require": { @@ -132,31 +207,33 @@ ], "support": { "issues": "https://github.com/FakerPHP/Faker/issues", - "source": "https://github.com/FakerPHP/Faker/tree/v1.23.1" + "source": "https://github.com/FakerPHP/Faker/tree/v1.24.1" }, - "time": "2024-01-02T13:46:09+00:00" + "time": "2024-11-21T13:46:39+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "7.9.2", + "version": "8.3.0", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "d281ed313b989f213357e3be1a179f02196ac99b" + "reference": "b920e5fcaf81d761b8fabe600ca90999beaefdb7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", - "reference": "d281ed313b989f213357e3be1a179f02196ac99b", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/b920e5fcaf81d761b8fabe600ca90999beaefdb7", + "reference": "b920e5fcaf81d761b8fabe600ca90999beaefdb7", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.5.3 || ^2.0.3", - "guzzlehttp/psr7": "^2.7.0", - "php": "^7.2.5 || ^8.0", + "guzzlehttp/promises": "^3.1", + "guzzlehttp/psr7": "^3.2", + "php": "^7.4 || ^8.0", "psr/http-client": "^1.0", - "symfony/deprecation-contracts": "^2.2 || ^3.0" + "psr/http-factory": "^1.0", + "symfony/polyfill-php80": "^1.25", + "symfony/polyfill-php82": "^1.27" }, "provide": { "psr/http-client-implementation": "1.0" @@ -164,9 +241,10 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "ext-curl": "*", - "guzzle/client-integration-tests": "3.0.2", + "guzzle/client-integration-tests": "4.0.1", + "guzzlehttp/test-server": "^1.1", "php-http/message-factory": "^1.1", - "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "phpunit/phpunit": "^9.6.34", "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { @@ -182,9 +260,6 @@ } }, "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { "GuzzleHttp\\": "src/" } @@ -244,7 +319,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.9.2" + "source": "https://github.com/guzzle/guzzle/tree/8.3.0" }, "funding": [ { @@ -260,28 +335,29 @@ "type": "tidelift" } ], - "time": "2024-07-24T11:22:20+00:00" + "time": "2026-10-18T13:38:43+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.0.3", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8" + "reference": "094d0ec418eb3b1411ea271a180ec95cae6ae933" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", - "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", + "url": "https://api.github.com/repos/guzzle/promises/zipball/094d0ec418eb3b1411ea271a180ec95cae6ae933", + "reference": "094d0ec418eb3b1411ea271a180ec95cae6ae933", "shasum": "" }, "require": { - "php": "^7.2.5 || ^8.0" + "php": "^7.4 || ^8.0", + "symfony/deprecation-contracts": "^2.5 || ^3.0" }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.39 || ^9.6.20" + "phpunit/phpunit": "^9.6.34" }, "type": "library", "extra": { @@ -327,7 +403,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.3" + "source": "https://github.com/guzzle/promises/tree/3.1.0" }, "funding": [ { @@ -343,36 +419,39 @@ "type": "tidelift" } ], - "time": "2024-07-18T10:29:17+00:00" + "time": "2026-10-18T12:48:16+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.7.0", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" + "reference": "cdc139396207a5eba10c242d241fb014cb098390" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", - "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/cdc139396207a5eba10c242d241fb014cb098390", + "reference": "cdc139396207a5eba10c242d241fb014cb098390", "shasum": "" }, "require": { - "php": "^7.2.5 || ^8.0", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.1 || ^2.0", - "ralouphie/getallheaders": "^3.0" + "php": "^7.4 || ^8.0", + "psr/http-factory": "^1.1", + "psr/http-message": "^2.0", + "symfony/polyfill-php80": "^1.25", + "symfony/polyfill-php82": "^1.27" }, "provide": { - "psr/http-factory-implementation": "1.0", - "psr/http-message-implementation": "1.0" + "psr/http-factory-implementation": "1.1", + "psr/http-message-implementation": "2.0" }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "http-interop/http-factory-tests": "0.9.0", - "phpunit/phpunit": "^8.5.39 || ^9.6.20" + "http-interop/http-factory-tests": "1.1.0", + "jshttp/mime-db": "1.54.0.1", + "php-http/psr7-integration-tests": "^1.5.1", + "phpunit/phpunit": "^9.6.34" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" @@ -443,7 +522,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.7.0" + "source": "https://github.com/guzzle/psr7/tree/3.2.0" }, "funding": [ { @@ -459,7 +538,7 @@ "type": "tidelift" } ], - "time": "2024-07-18T11:15:46+00:00" + "time": "2026-10-17T23:57:19+00:00" }, { "name": "kevinlebrun/colors.php", @@ -518,32 +597,32 @@ }, { "name": "laravel/serializable-closure", - "version": "v1.3.4", + "version": "v2.1.0", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "61b87392d986dc49ad5ef64e75b1ff5fee24ef81" + "reference": "2d5869a838bbcf37e0d8b0568fc41914e81374b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/61b87392d986dc49ad5ef64e75b1ff5fee24ef81", - "reference": "61b87392d986dc49ad5ef64e75b1ff5fee24ef81", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/2d5869a838bbcf37e0d8b0568fc41914e81374b5", + "reference": "2d5869a838bbcf37e0d8b0568fc41914e81374b5", "shasum": "" }, "require": { - "php": "^7.3|^8.0" + "php": "^8.1" }, "require-dev": { - "illuminate/support": "^8.0|^9.0|^10.0|^11.0", - "nesbot/carbon": "^2.61|^3.0", - "pestphp/pest": "^1.21.3", - "phpstan/phpstan": "^1.8.2", - "symfony/var-dumper": "^5.4.11|^6.2.0|^7.0.0" + "illuminate/support": "^10.0|^11.0|^12.0|^13.0", + "nesbot/carbon": "^2.67|^3.0", + "pestphp/pest": "^2.36|^3.0|^4.0", + "phpstan/phpstan": "^2.0", + "symfony/var-dumper": "^6.2.0|^7.0.0|^8.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.x-dev" + "dev-master": "2.x-dev" } }, "autoload": { @@ -575,46 +654,59 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2024-08-02T07:48:17+00:00" + "time": "2026-09-22T14:32:34+00:00" }, { "name": "league/commonmark", - "version": "1.6.7", + "version": "2.10.4", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "2b8185c13bc9578367a5bf901881d1c1b5bbd09b" + "reference": "40821b7606d8d946bac57dbd2290076c722e3a65" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/2b8185c13bc9578367a5bf901881d1c1b5bbd09b", - "reference": "2b8185c13bc9578367a5bf901881d1c1b5bbd09b", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/40821b7606d8d946bac57dbd2290076c722e3a65", + "reference": "40821b7606d8d946bac57dbd2290076c722e3a65", "shasum": "" }, "require": { "ext-mbstring": "*", - "php": "^7.1 || ^8.0" - }, - "conflict": { - "scrutinizer/ocular": "1.7.*" + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/deprecation-contracts": "^2.1 || ^3.0", + "symfony/polyfill-php80": "^1.16" }, "require-dev": { - "cebe/markdown": "~1.0", - "commonmark/commonmark.js": "0.29.2", - "erusev/parsedown": "~1.0", + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.31.1", + "commonmark/commonmark.js": "0.31.1", + "composer/package-versions-deprecated": "^1.8", + "embed/embed": "^4.4", + "erusev/parsedown": "^1.0", "ext-json": "*", "github/gfm": "0.29.0", - "michelf/php-markdown": "~1.4", - "mikehaertl/php-shellcommand": "^1.4", - "phpstan/phpstan": "^0.12.90", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.2", - "scrutinizer/ocular": "^1.5", - "symfony/finder": "^4.2" + "michelf/php-markdown": "^1.4 || ^2.0", + "nyholm/psr7": "^1.5", + "phpstan/phpstan": "^2.0.0", + "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0 || ^12.0.0 || ^13.0.0", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3 | ^6.0 | ^7.0 || ^8.0", + "symfony/process": "^5.4 | ^6.0 | ^7.0 || ^8.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0 || ^8.0", + "unleashedtech/php-coding-standard": "^3.1.1", + "vimeo/psalm": "^4.24.0 || ^5.0.0 || ^6.0.0" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" }, - "bin": [ - "bin/commonmark" - ], "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.11-dev" + } + }, "autoload": { "psr-4": { "League\\CommonMark\\": "src" @@ -632,7 +724,7 @@ "role": "Lead Developer" } ], - "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and Github-Flavored Markdown (GFM)", + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", "homepage": "https://commonmark.thephpleague.com", "keywords": [ "commonmark", @@ -646,6 +738,7 @@ ], "support": { "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", "issues": "https://github.com/thephpleague/commonmark/issues", "rss": "https://github.com/thephpleague/commonmark/releases.atom", "source": "https://github.com/thephpleague/commonmark" @@ -668,20 +761,102 @@ "type": "tidelift" } ], - "time": "2022-01-13T17:18:13+00:00" + "time": "2026-10-17T19:59:50+00:00" + }, + { + "name": "league/config", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/config.git", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/config/zipball/754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "reference": "754b3604fb2984c71f4af4a9cbe7b57f346ec1f3", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.8.2", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", + "keywords": [ + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" + ], + "support": { + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + } + ], + "time": "2022-12-11T20:36:23+00:00" }, { "name": "myclabs/php-enum", - "version": "1.8.4", + "version": "1.8.5", "source": { "type": "git", "url": "https://github.com/myclabs/php-enum.git", - "reference": "a867478eae49c9f59ece437ae7f9506bfaa27483" + "reference": "e7be26966b7398204a234f8673fdad5ac6277802" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/php-enum/zipball/a867478eae49c9f59ece437ae7f9506bfaa27483", - "reference": "a867478eae49c9f59ece437ae7f9506bfaa27483", + "url": "https://api.github.com/repos/myclabs/php-enum/zipball/e7be26966b7398204a234f8673fdad5ac6277802", + "reference": "e7be26966b7398204a234f8673fdad5ac6277802", "shasum": "" }, "require": { @@ -691,7 +866,7 @@ "require-dev": { "phpunit/phpunit": "^9.5", "squizlabs/php_codesniffer": "1.*", - "vimeo/psalm": "^4.6.2" + "vimeo/psalm": "^4.6.2 || ^5.2" }, "type": "library", "autoload": { @@ -713,13 +888,13 @@ } ], "description": "PHP Enum implementation", - "homepage": "http://github.com/myclabs/php-enum", + "homepage": "https://github.com/myclabs/php-enum", "keywords": [ "enum" ], "support": { "issues": "https://github.com/myclabs/php-enum/issues", - "source": "https://github.com/myclabs/php-enum/tree/1.8.4" + "source": "https://github.com/myclabs/php-enum/tree/1.8.5" }, "funding": [ { @@ -731,29 +906,188 @@ "type": "tidelift" } ], - "time": "2022-08-04T09:53:51+00:00" + "time": "2025-01-14T11:49:03+00:00" + }, + { + "name": "nette/schema", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/nette/schema.git", + "reference": "af9fa8a86bfca9b02b10346220db26e62ef942ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/schema/zipball/af9fa8a86bfca9b02b10346220db26e62ef942ec", + "reference": "af9fa8a86bfca9b02b10346220db26e62ef942ec", + "shasum": "" + }, + "require": { + "nette/utils": "^4.0", + "php": "8.1 - 8.6" + }, + "require-dev": { + "nette/phpstan-rules": "^1.0.7", + "nette/tester": "^2.6", + "phpstan/extension-installer": "^1.4@stable", + "phpstan/phpstan": "^2.3@stable", + "tracy/tracy": "^2.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "autoload": { + "psr-4": { + "Nette\\": "src" + }, + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + } + ], + "description": "📐 Nette Schema: validates and normalizes data such as configuration or API input against a schema described in a few readable lines of PHP, with precise error messages.", + "homepage": "https://doc.nette.org/schema", + "keywords": [ + "configuration", + "data validation", + "nette", + "normalization", + "schema", + "validation" + ], + "support": { + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.4.0" + }, + "time": "2026-10-22T02:12:50+00:00" + }, + { + "name": "nette/utils", + "version": "v4.1.6", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "6bf24518accf32cf845bca305e0b92078700fd01" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/6bf24518accf32cf845bca305e0b92078700fd01", + "reference": "6bf24518accf32cf845bca305e0b92078700fd01", + "shasum": "" + }, + "require": { + "php": "8.2 - 8.6" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "^1.2", + "nette/phpstan-rules": "^1.0", + "nette/tester": "^2.5", + "phpstan/extension-installer": "^1.4@stable", + "phpstan/phpstan": "^2.1@stable", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::chr(), ord() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.1-dev" + } + }, + "autoload": { + "psr-4": { + "Nette\\": "src" + }, + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.1.6" + }, + "time": "2026-10-20T17:07:56+00:00" }, { "name": "nikic/php-parser", - "version": "v4.19.1", + "version": "v5.9.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "4e1b88d21c69391150ace211e9eaf05810858d0b" + "reference": "9e33da9553fe7786f0962b35f4e4ecf01be89def" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/4e1b88d21c69391150ace211e9eaf05810858d0b", - "reference": "4e1b88d21c69391150ace211e9eaf05810858d0b", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/9e33da9553fe7786f0962b35f4e4ecf01be89def", + "reference": "9e33da9553fe7786f0962b35f4e4ecf01be89def", "shasum": "" }, "require": { + "ext-json": "*", "ext-tokenizer": "*", - "php": ">=7.1" + "php": ">=7.4" }, "require-dev": { "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + "phpunit/phpunit": "^9.0" }, "bin": [ "bin/php-parse" @@ -761,7 +1095,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.9-dev" + "dev-master": "5.x-dev" } }, "autoload": { @@ -785,22 +1119,22 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.19.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.9.0" }, - "time": "2024-03-17T08:10:35+00:00" + "time": "2026-09-13T18:51:52+00:00" }, { "name": "php-di/invoker", - "version": "2.3.4", + "version": "2.3.7", "source": { "type": "git", "url": "https://github.com/PHP-DI/Invoker.git", - "reference": "33234b32dafa8eb69202f950a1fc92055ed76a86" + "reference": "3c1ddfdef181431fbc4be83378f6d036d59e81e1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-DI/Invoker/zipball/33234b32dafa8eb69202f950a1fc92055ed76a86", - "reference": "33234b32dafa8eb69202f950a1fc92055ed76a86", + "url": "https://api.github.com/repos/PHP-DI/Invoker/zipball/3c1ddfdef181431fbc4be83378f6d036d59e81e1", + "reference": "3c1ddfdef181431fbc4be83378f6d036d59e81e1", "shasum": "" }, "require": { @@ -810,7 +1144,7 @@ "require-dev": { "athletic/athletic": "~0.1.8", "mnapoli/hard-mode": "~0.3.0", - "phpunit/phpunit": "^9.0" + "phpunit/phpunit": "^9.0 || ^10 || ^11 || ^12" }, "type": "library", "autoload": { @@ -834,7 +1168,7 @@ ], "support": { "issues": "https://github.com/PHP-DI/Invoker/issues", - "source": "https://github.com/PHP-DI/Invoker/tree/2.3.4" + "source": "https://github.com/PHP-DI/Invoker/tree/2.3.7" }, "funding": [ { @@ -842,43 +1176,40 @@ "type": "github" } ], - "time": "2023-09-08T09:24:21+00:00" + "time": "2025-08-30T10:22:22+00:00" }, { "name": "php-di/php-di", - "version": "6.4.0", + "version": "7.1.1", "source": { "type": "git", "url": "https://github.com/PHP-DI/PHP-DI.git", - "reference": "ae0f1b3b03d8b29dff81747063cbfd6276246cc4" + "reference": "f88054cc052e40dbe7b383c8817c19442d480352" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/ae0f1b3b03d8b29dff81747063cbfd6276246cc4", - "reference": "ae0f1b3b03d8b29dff81747063cbfd6276246cc4", + "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/f88054cc052e40dbe7b383c8817c19442d480352", + "reference": "f88054cc052e40dbe7b383c8817c19442d480352", "shasum": "" }, "require": { - "laravel/serializable-closure": "^1.0", - "php": ">=7.4.0", + "laravel/serializable-closure": "^1.0 || ^2.0", + "php": ">=8.0", "php-di/invoker": "^2.0", - "php-di/phpdoc-reader": "^2.0.1", - "psr/container": "^1.0" + "psr/container": "^1.1 || ^2.0" }, "provide": { "psr/container-implementation": "^1.0" }, "require-dev": { - "doctrine/annotations": "~1.10", - "friendsofphp/php-cs-fixer": "^2.4", - "mnapoli/phpunit-easymock": "^1.2", - "ocramius/proxy-manager": "^2.11.2", - "phpstan/phpstan": "^0.12", - "phpunit/phpunit": "^9.5" + "friendsofphp/php-cs-fixer": "^3", + "friendsofphp/proxy-manager-lts": "^1", + "mnapoli/phpunit-easymock": "^1.3", + "phpunit/phpunit": "^9.6 || ^10 || ^11", + "vimeo/psalm": "^5|^6" }, "suggest": { - "doctrine/annotations": "Install it if you want to use annotations (version ~1.2)", - "ocramius/proxy-manager": "Install it if you want to use lazy injection (version ~2.0)" + "friendsofphp/proxy-manager-lts": "Install it if you want to use lazy injection (version ^1)" }, "type": "library", "autoload": { @@ -906,7 +1237,7 @@ ], "support": { "issues": "https://github.com/PHP-DI/PHP-DI/issues", - "source": "https://github.com/PHP-DI/PHP-DI/tree/6.4.0" + "source": "https://github.com/PHP-DI/PHP-DI/tree/7.1.1" }, "funding": [ { @@ -918,74 +1249,33 @@ "type": "tidelift" } ], - "time": "2022-04-09T16:46:38+00:00" - }, - { - "name": "php-di/phpdoc-reader", - "version": "2.2.1", - "source": { - "type": "git", - "url": "https://github.com/PHP-DI/PhpDocReader.git", - "reference": "66daff34cbd2627740ffec9469ffbac9f8c8185c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHP-DI/PhpDocReader/zipball/66daff34cbd2627740ffec9469ffbac9f8c8185c", - "reference": "66daff34cbd2627740ffec9469ffbac9f8c8185c", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "require-dev": { - "mnapoli/hard-mode": "~0.3.0", - "phpunit/phpunit": "^8.5|^9.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "PhpDocReader\\": "src/PhpDocReader" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PhpDocReader parses @var and @param values in PHP docblocks (supports namespaced class names with the same resolution rules as PHP)", - "keywords": [ - "phpdoc", - "reflection" - ], - "support": { - "issues": "https://github.com/PHP-DI/PhpDocReader/issues", - "source": "https://github.com/PHP-DI/PhpDocReader/tree/2.2.1" - }, - "time": "2020-10-12T12:39:22+00:00" + "time": "2025-08-16T11:10:48+00:00" }, { "name": "php-school/cli-md-renderer", - "version": "1.0.0", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/php-school/cli-md-renderer.git", - "reference": "70b7d1da7142c90c99299018da4b770f681fcfc8" + "reference": "6254a3d486f9dcf120a06fd10fcd85b3ff2bc8fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-school/cli-md-renderer/zipball/70b7d1da7142c90c99299018da4b770f681fcfc8", - "reference": "70b7d1da7142c90c99299018da4b770f681fcfc8", + "url": "https://api.github.com/repos/php-school/cli-md-renderer/zipball/6254a3d486f9dcf120a06fd10fcd85b3ff2bc8fb", + "reference": "6254a3d486f9dcf120a06fd10fcd85b3ff2bc8fb", "shasum": "" }, "require": { "kevinlebrun/colors.php": "^1.0", - "league/commonmark": "^1.5.6", - "php": ">=7.1", - "php-school/keylighter": "^0.8.4" + "league/commonmark": "^2.8", + "nette/schema": "^1.2", + "php": "^8.1", + "php-school/keylighter": "^0.8.5" }, "require-dev": { - "phpstan/phpstan": "^0.12.50", - "phpunit/phpunit": "^7.0 | ^8.0 | ^9.0", - "squizlabs/php_codesniffer": "^3.0" + "phpstan/phpstan": "^2.1", + "phpunit/phpunit": "^10.5 || ^11.5 || ^12.0", + "squizlabs/php_codesniffer": "^3.10" }, "type": "library", "autoload": { @@ -1005,35 +1295,35 @@ ], "description": "A CLI Markdown Render for league/commonmark compatible AST", "support": { - "source": "https://github.com/php-school/cli-md-renderer/tree/1.0.0" + "source": "https://github.com/php-school/cli-md-renderer/tree/2.0.0" }, - "time": "2022-11-21T21:02:26+00:00" + "time": "2026-10-22T12:41:24+00:00" }, { "name": "php-school/cli-menu", - "version": "4.3.0", + "version": "4.5.0", "source": { "type": "git", "url": "https://github.com/php-school/cli-menu.git", - "reference": "bad5e0177f2b3ada6dc14eee4011fee4001b7679" + "reference": "0fcc763521c7b27412ba3871cb9c8918744065b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-school/cli-menu/zipball/bad5e0177f2b3ada6dc14eee4011fee4001b7679", - "reference": "bad5e0177f2b3ada6dc14eee4011fee4001b7679", + "url": "https://api.github.com/repos/php-school/cli-menu/zipball/0fcc763521c7b27412ba3871cb9c8918744065b3", + "reference": "0fcc763521c7b27412ba3871cb9c8918744065b3", "shasum": "" }, "require": { "beberlei/assert": "^2.4 | ^3", "ext-mbstring": "*", "ext-posix": "*", - "php": ">=7.1", - "php-school/terminal": "^0.2.1" + "php": ">=8.2", + "php-school/terminal": "^0.3" }, "require-dev": { - "phpstan/phpstan": "^0.12", - "phpunit/phpunit": "^8.0 | ^9.0", - "squizlabs/php_codesniffer": "^3.2" + "friendsofphp/php-cs-fixer": "*", + "phpstan/phpstan": "^2.1", + "phpunit/phpunit": "^11.5" }, "type": "library", "autoload": { @@ -1069,29 +1359,29 @@ ], "support": { "issues": "https://github.com/php-school/cli-menu/issues", - "source": "https://github.com/php-school/cli-menu/tree/4.3.0" + "source": "https://github.com/php-school/cli-menu/tree/4.5.0" }, - "time": "2021-12-16T09:40:06+00:00" + "time": "2026-10-22T15:28:12+00:00" }, { "name": "php-school/keylighter", - "version": "0.8.4", + "version": "0.8.5", "source": { "type": "git", "url": "https://github.com/php-school/KeyLighter.git", - "reference": "f534f8de4bf99d2a8f54991fa55661940e23210d" + "reference": "155bc2b3fb12e99d4339c5f77404dad7d173d07b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-school/KeyLighter/zipball/f534f8de4bf99d2a8f54991fa55661940e23210d", - "reference": "f534f8de4bf99d2a8f54991fa55661940e23210d", + "url": "https://api.github.com/repos/php-school/KeyLighter/zipball/155bc2b3fb12e99d4339c5f77404dad7d173d07b", + "reference": "155bc2b3fb12e99d4339c5f77404dad7d173d07b", "shasum": "" }, "require": { "php": "^7.1.3 | ^8.0" }, "require-dev": { - "phpunit/phpunit": "^8.0", + "phpunit/phpunit": "^8.0 | ^9.6", "symfony/console": "^2.8|^3.0" }, "suggest": { @@ -1121,9 +1411,9 @@ ], "description": "Yet another syntax highlighter for PHP", "support": { - "source": "https://github.com/php-school/KeyLighter/tree/0.8.4" + "source": "https://github.com/php-school/KeyLighter/tree/0.8.5" }, - "time": "2020-11-01T14:21:30+00:00" + "time": "2026-10-22T12:11:43+00:00" }, { "name": "php-school/php-workshop", @@ -1131,40 +1421,39 @@ "source": { "type": "git", "url": "https://github.com/php-school/php-workshop.git", - "reference": "73febf8c62d982cd74896df9266522dc2a5153b5" + "reference": "cfd75436bb91c91fb2795a0b598480ddb15db71e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-school/php-workshop/zipball/73febf8c62d982cd74896df9266522dc2a5153b5", - "reference": "73febf8c62d982cd74896df9266522dc2a5153b5", + "url": "https://api.github.com/repos/php-school/php-workshop/zipball/cfd75436bb91c91fb2795a0b598480ddb15db71e", + "reference": "cfd75436bb91c91fb2795a0b598480ddb15db71e", "shasum": "" }, "require": { "ext-json": "*", "ext-pdo": "*", "ext-pdo_sqlite": "*", - "fakerphp/faker": "^1.10.1", - "guzzlehttp/guzzle": "^7.2", + "fakerphp/faker": "^1.23", + "guzzlehttp/guzzle": "^7.9 | ^8.0", "myclabs/php-enum": "^1.4", - "nikic/php-parser": "^4.0", - "php": ">=8.0", - "php-di/php-di": "^6.0", - "php-school/cli-md-renderer": "^1.0", - "php-school/cli-menu": "^4.1", - "php-school/keylighter": "^0.8.4", - "psr/container": "^1.0", - "psr/http-message": "^1.0", - "psr/log": "^1.1", - "symfony/filesystem": "^4.0 | ^5.0 | ^6.0", - "symfony/process": "^4.0 | ^5.0 | ^6.0" + "nikic/php-parser": "^5.0", + "php": "^8.2", + "php-di/php-di": "^6.4 | ^7.0", + "php-school/cli-md-renderer": "^2.0", + "php-school/cli-menu": "^4.5", + "php-school/keylighter": "^0.8.5", + "psr/container": "^1.1 | ^2.0", + "psr/http-message": "^1.1 | ^2.0", + "psr/log": "^1.1 | ^2.0 | ^3.0", + "symfony/filesystem": "^6.4 | ^7.0 | ^8.0", + "symfony/process": "^6.4 | ^7.0 | ^8.0" }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8", "composer/composer": "^2.0", "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^1.8", - "phpunit/phpunit": "^8.5", - "yoast/phpunit-polyfills": "^0.2.0" + "phpstan/phpstan": "^2.1", + "phpunit/phpunit": "^11.5" }, "type": "library", "extra": { @@ -1212,30 +1501,29 @@ "issues": "https://github.com/php-school/php-workshop/issues", "source": "https://github.com/php-school/php-workshop/tree/docker-fixes" }, - "time": "2024-09-04T11:22:50+00:00" + "time": "2026-10-22T15:29:57+00:00" }, { "name": "php-school/terminal", - "version": "0.2.1", + "version": "0.3.0", "source": { "type": "git", "url": "https://github.com/php-school/terminal.git", - "reference": "725f86c7db996a4cf65648022f17e22391e97320" + "reference": "5574b1ab03da3f0a3690d5416b693aca9ed143e3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-school/terminal/zipball/725f86c7db996a4cf65648022f17e22391e97320", - "reference": "725f86c7db996a4cf65648022f17e22391e97320", + "url": "https://api.github.com/repos/php-school/terminal/zipball/5574b1ab03da3f0a3690d5416b693aca9ed143e3", + "reference": "5574b1ab03da3f0a3690d5416b693aca9ed143e3", "shasum": "" }, "require": { - "ext-posix": "*", - "php": ">=7.1" + "php": ">=8.2" }, "require-dev": { - "phpstan/phpstan": "^0.9.2", - "phpunit/phpunit": "^7.1", - "squizlabs/php_codesniffer": "^3.2" + "phpstan/phpstan": "^2.1", + "phpunit/phpunit": "^11.5", + "squizlabs/php_codesniffer": "^3.13" }, "type": "library", "autoload": { @@ -1267,28 +1555,33 @@ ], "support": { "issues": "https://github.com/php-school/terminal/issues", - "source": "https://github.com/php-school/terminal/tree/0.2.1" + "source": "https://github.com/php-school/terminal/tree/0.3.0" }, - "time": "2019-12-17T21:56:06+00:00" + "time": "2026-10-22T15:19:19+00:00" }, { "name": "psr/container", - "version": "1.1.2", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", "shasum": "" }, "require": { "php": ">=7.4.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, "autoload": { "psr-4": { "Psr\\Container\\": "src/" @@ -1315,9 +1608,59 @@ ], "support": { "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.2" + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } }, - "time": "2021-11-05T16:50:12+00:00" + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" }, { "name": "psr/http-client", @@ -1428,16 +1771,16 @@ }, { "name": "psr/http-message", - "version": "1.1", + "version": "2.0", "source": { "type": "git", "url": "https://github.com/php-fig/http-message.git", - "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba" + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba", - "reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", "shasum": "" }, "require": { @@ -1446,7 +1789,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { @@ -1461,7 +1804,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interface for HTTP messages", @@ -1475,36 +1818,36 @@ "response" ], "support": { - "source": "https://github.com/php-fig/http-message/tree/1.1" + "source": "https://github.com/php-fig/http-message/tree/2.0" }, - "time": "2023-04-04T09:50:52+00:00" + "time": "2023-04-04T09:54:51+00:00" }, { "name": "psr/log", - "version": "1.1.4", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=8.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "3.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Log\\": "Psr/Log/" + "Psr\\Log\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -1525,66 +1868,22 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/1.1.4" - }, - "time": "2021-05-03T11:20:27+00:00" - }, - { - "name": "ralouphie/getallheaders", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/ralouphie/getallheaders.git", - "reference": "120b605dfeb996808c31b6477290a714d356e822" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", - "reference": "120b605dfeb996808c31b6477290a714d356e822", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "require-dev": { - "php-coveralls/php-coveralls": "^2.1", - "phpunit/phpunit": "^5 || ^6.5" - }, - "type": "library", - "autoload": { - "files": [ - "src/getallheaders.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ralph Khattar", - "email": "ralph.khattar@gmail.com" - } - ], - "description": "A polyfill for getallheaders.", - "support": { - "issues": "https://github.com/ralouphie/getallheaders/issues", - "source": "https://github.com/ralouphie/getallheaders/tree/develop" + "source": "https://github.com/php-fig/log/tree/3.0.2" }, - "time": "2019-03-08T08:55:37+00:00" + "time": "2024-09-11T13:17:53+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v3.5.0", + "version": "v3.7.1", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" + "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", - "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/f3202fa1b5097b0af062dc978b32ecf63404e31d", + "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d", "shasum": "" }, "require": { @@ -1592,12 +1891,12 @@ }, "type": "library", "extra": { - "branch-alias": { - "dev-main": "3.5-dev" - }, "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.7-dev" } }, "autoload": { @@ -1622,7 +1921,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.7.1" }, "funding": [ { @@ -1633,34 +1932,39 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-04-18T09:32:20+00:00" + "time": "2026-06-05T06:23:12+00:00" }, { "name": "symfony/filesystem", - "version": "v6.4.9", + "version": "v8.1.9", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "b51ef8059159330b74a4d52f68e671033c0fe463" + "reference": "43d109c803d22c00bb820ed45df250b6a8792ca2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/b51ef8059159330b74a4d52f68e671033c0fe463", - "reference": "b51ef8059159330b74a4d52f68e671033c0fe463", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/43d109c803d22c00bb820ed45df250b6a8792ca2", + "reference": "43d109c803d22c00bb820ed45df250b6a8792ca2", "shasum": "" }, "require": { - "php": ">=8.1", + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.8" }, "require-dev": { - "symfony/process": "^5.4|^6.4|^7.0" + "symfony/process": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -1688,7 +1992,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/v8.1.9" }, "funding": [ { @@ -1699,29 +2003,33 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-06-28T09:49:33+00:00" + "time": "2026-10-06T20:05:50+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.30.0", + "version": "v1.37.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "0424dff1c58f028c451efff2045f5d92410bd540" + "reference": "141046a8f9477948ff284fa65be2095baafb94f2" }, "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/141046a8f9477948ff284fa65be2095baafb94f2", + "reference": "141046a8f9477948ff284fa65be2095baafb94f2", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" }, "provide": { "ext-ctype": "*" @@ -1732,8 +2040,8 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -1767,7 +2075,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.37.0" }, "funding": [ { @@ -1778,29 +2086,34 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-05-31T15:07:36+00:00" + "time": "2026-04-10T16:19:22+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.30.0", + "version": "v1.43.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c" + "reference": "4d5d331bf731e0aedbc6b2f5e61135b7b7996a72" }, "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/4d5d331bf731e0aedbc6b2f5e61135b7b7996a72", + "reference": "4d5d331bf731e0aedbc6b2f5e61135b7b7996a72", "shasum": "" }, "require": { - "php": ">=7.1" + "ext-iconv": "*", + "php": ">=7.2" }, "provide": { "ext-mbstring": "*" @@ -1811,8 +2124,170 @@ "type": "library", "extra": { "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "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 for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.43.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-09-24T15:19:04+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.43.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "9c6a5d6b01ca51d486c813e9a9c0ed55f208bb74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/9c6a5d6b01ca51d486c813e9a9c0ed55f208bb74", + "reference": "9c6a5d6b01ca51d486c813e9a9c0ed55f208bb74", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.43.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-09-25T15:50:05+00:00" + }, + { + "name": "symfony/polyfill-php82", + "version": "v1.43.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php82.git", + "reference": "843bbe8b2a7934307b749751eede0f111f5d1cfc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php82/zipball/843bbe8b2a7934307b749751eede0f111f5d1cfc", + "reference": "843bbe8b2a7934307b749751eede0f111f5d1cfc", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" } }, "autoload": { @@ -1820,8 +2295,11 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - } + "Symfony\\Polyfill\\Php82\\": "" + }, + "classmap": [ + "Resources/stubs" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1837,17 +2315,16 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for the Mbstring extension", + "description": "Symfony polyfill backporting some PHP 8.2+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", - "mbstring", "polyfill", "portable", "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-php82/tree/v1.43.0" }, "funding": [ { @@ -1858,29 +2335,33 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-06-19T12:30:46+00:00" + "time": "2026-09-25T15:50:05+00:00" }, { "name": "symfony/process", - "version": "v6.4.8", + "version": "v8.1.9", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5" + "reference": "59a682fd049b2d4d37c444f5ac21b7d01b8c7189" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/8d92dd79149f29e89ee0f480254db595f6a6a2c5", - "reference": "8d92dd79149f29e89ee0f480254db595f6a6a2c5", + "url": "https://api.github.com/repos/symfony/process/zipball/59a682fd049b2d4d37c444f5ac21b7d01b8c7189", + "reference": "59a682fd049b2d4d37c444f5ac21b7d01b8c7189", "shasum": "" }, "require": { - "php": ">=8.1" + "php": ">=8.4.1" }, "type": "library", "autoload": { @@ -1908,7 +2389,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/v8.1.9" }, "funding": [ { @@ -1919,101 +2400,35 @@ "url": "https://github.com/fabpot", "type": "github" }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, { "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", "type": "tidelift" } ], - "time": "2024-05-31T14:49:08+00:00" + "time": "2026-10-08T16:57:43+00:00" } ], "packages-dev": [ - { - "name": "doctrine/instantiator", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", - "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", - "shasum": "" - }, - "require": { - "php": "^8.1" - }, - "require-dev": { - "doctrine/coding-standard": "^11", - "ext-pdo": "*", - "ext-phar": "*", - "phpbench/phpbench": "^1.2", - "phpstan/phpstan": "^1.9.4", - "phpstan/phpstan-phpunit": "^1.3", - "phpunit/phpunit": "^9.5.27", - "vimeo/psalm": "^5.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "https://ocramius.github.io/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", - "keywords": [ - "constructor", - "instantiate" - ], - "support": { - "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/2.0.0" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", - "type": "tidelift" - } - ], - "time": "2022-12-30T00:23:10+00:00" - }, { "name": "myclabs/deep-copy", - "version": "1.12.0", + "version": "1.14.0", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" + "reference": "8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", - "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae", + "reference": "8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": "^8.0" }, "conflict": { "doctrine/collections": "<1.6.8", @@ -2048,15 +2463,15 @@ ], "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.14.0" }, "funding": [ { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" + "url": "https://github.com/mnapoli", + "type": "github" } ], - "time": "2024-06-12T14:39:25+00:00" + "time": "2026-08-11T10:17:44+00:00" }, { "name": "phar-io/manifest", @@ -2178,20 +2593,15 @@ }, { "name": "phpstan/phpstan", - "version": "1.12.2", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpstan.git", - "reference": "0ca1c7bb55fca8fe6448f16fff0f311ccec960a1" - }, + "version": "2.3.1", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/0ca1c7bb55fca8fe6448f16fff0f311ccec960a1", - "reference": "0ca1c7bb55fca8fe6448f16fff0f311ccec960a1", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/6155239b488e95d26d1ebd95c6b4bb294d7f09db", + "reference": "6155239b488e95d26d1ebd95c6b4bb294d7f09db", "shasum": "" }, "require": { - "php": "^7.2|^8.0" + "php": "^7.4|^8.0" }, "conflict": { "phpstan/phpstan-shim": "*" @@ -2210,6 +2620,17 @@ "license": [ "MIT" ], + "authors": [ + { + "name": "Ondřej Mirtes" + }, + { + "name": "Markus Staab" + }, + { + "name": "Vincent Langlet" + } + ], "description": "PHPStan - PHP Static Analysis Tool", "keywords": [ "dev", @@ -2232,39 +2653,39 @@ "type": "github" } ], - "time": "2024-09-05T16:09:28+00:00" + "time": "2026-10-08T21:09:11+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.32", + "version": "11.0.12", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5" + "reference": "2c1ed04922802c15e1de5d7447b4856de949cf56" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5", - "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2c1ed04922802c15e1de5d7447b4856de949cf56", + "reference": "2c1ed04922802c15e1de5d7447b4856de949cf56", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.19.1 || ^5.1.0", - "php": ">=7.3", - "phpunit/php-file-iterator": "^3.0.6", - "phpunit/php-text-template": "^2.0.4", - "sebastian/code-unit-reverse-lookup": "^2.0.3", - "sebastian/complexity": "^2.0.3", - "sebastian/environment": "^5.1.5", - "sebastian/lines-of-code": "^1.0.4", - "sebastian/version": "^3.0.2", - "theseer/tokenizer": "^1.2.3" + "nikic/php-parser": "^5.7.0", + "php": ">=8.2", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-text-template": "^4.0.1", + "sebastian/code-unit-reverse-lookup": "^4.0.1", + "sebastian/complexity": "^4.0.1", + "sebastian/environment": "^7.2.1", + "sebastian/lines-of-code": "^3.0.1", + "sebastian/version": "^5.0.2", + "theseer/tokenizer": "^1.3.1" }, "require-dev": { - "phpunit/phpunit": "^9.6" + "phpunit/phpunit": "^11.5.46" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -2273,7 +2694,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "9.2.x-dev" + "dev-main": "11.0.x-dev" } }, "autoload": { @@ -2302,40 +2723,52 @@ "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/9.2.32" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.12" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage", + "type": "tidelift" } ], - "time": "2024-08-22T04:23:01+00:00" + "time": "2025-12-24T07:01:01+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "3.0.6", + "version": "5.1.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" + "reference": "2f3a64888c814fc235386b7387dd5b5ed92ad903" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/2f3a64888c814fc235386b7387dd5b5ed92ad903", + "reference": "2f3a64888c814fc235386b7387dd5b5ed92ad903", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^11.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-main": "5.1-dev" } }, "autoload": { @@ -2362,36 +2795,49 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-file-iterator", + "type": "tidelift" } ], - "time": "2021-12-02T12:48:52+00:00" + "time": "2026-02-02T13:52:54+00:00" }, { "name": "phpunit/php-invoker", - "version": "3.1.1", + "version": "5.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2", + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.2" }, "require-dev": { "ext-pcntl": "*", - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^11.0" }, "suggest": { "ext-pcntl": "*" @@ -2399,7 +2845,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -2425,7 +2871,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.1" }, "funding": [ { @@ -2433,32 +2880,32 @@ "type": "github" } ], - "time": "2020-09-28T05:58:55+00:00" + "time": "2024-07-03T05:07:44+00:00" }, { "name": "phpunit/php-text-template", - "version": "2.0.4", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -2484,7 +2931,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/4.0.1" }, "funding": [ { @@ -2492,32 +2940,32 @@ "type": "github" } ], - "time": "2020-10-26T05:33:50+00:00" + "time": "2024-07-03T05:08:43+00:00" }, { "name": "phpunit/php-timer", - "version": "5.0.3", + "version": "7.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -2543,7 +2991,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + "security": "https://github.com/sebastianbergmann/php-timer/security/policy", + "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.1" }, "funding": [ { @@ -2551,54 +3000,53 @@ "type": "github" } ], - "time": "2020-10-26T13:16:10+00:00" + "time": "2024-07-03T05:09:35+00:00" }, { "name": "phpunit/phpunit", - "version": "9.6.20", + "version": "11.5.57", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "49d7820565836236411f5dc002d16dd689cde42f" + "reference": "36b75bf56a8535623f5b3e24b27ea1823759da1a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/49d7820565836236411f5dc002d16dd689cde42f", - "reference": "49d7820565836236411f5dc002d16dd689cde42f", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/36b75bf56a8535623f5b3e24b27ea1823759da1a", + "reference": "36b75bf56a8535623f5b3e24b27ea1823759da1a", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.5.0 || ^2", "ext-dom": "*", + "ext-filter": "*", "ext-json": "*", "ext-libxml": "*", "ext-mbstring": "*", - "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.12.0", + "myclabs/deep-copy": "^1.14.0", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", - "php": ">=7.3", - "phpunit/php-code-coverage": "^9.2.31", - "phpunit/php-file-iterator": "^3.0.6", - "phpunit/php-invoker": "^3.1.1", - "phpunit/php-text-template": "^2.0.4", - "phpunit/php-timer": "^5.0.3", - "sebastian/cli-parser": "^1.0.2", - "sebastian/code-unit": "^1.0.8", - "sebastian/comparator": "^4.0.8", - "sebastian/diff": "^4.0.6", - "sebastian/environment": "^5.1.5", - "sebastian/exporter": "^4.0.6", - "sebastian/global-state": "^5.0.7", - "sebastian/object-enumerator": "^4.0.4", - "sebastian/resource-operations": "^3.0.4", - "sebastian/type": "^3.2.1", - "sebastian/version": "^3.0.2" + "php": ">=8.2", + "phpunit/php-code-coverage": "^11.0.12", + "phpunit/php-file-iterator": "^5.1.1", + "phpunit/php-invoker": "^5.0.1", + "phpunit/php-text-template": "^4.0.1", + "phpunit/php-timer": "^7.0.1", + "sebastian/cli-parser": "^3.0.2", + "sebastian/code-unit": "^3.0.3", + "sebastian/comparator": "^6.3.3", + "sebastian/diff": "^6.0.2", + "sebastian/environment": "^7.2.1", + "sebastian/exporter": "^6.3.2", + "sebastian/global-state": "^7.0.2", + "sebastian/object-enumerator": "^6.0.1", + "sebastian/recursion-context": "^6.0.3", + "sebastian/type": "^5.1.3", + "sebastian/version": "^5.0.2", + "staabm/side-effects-detector": "^1.0.5" }, "suggest": { - "ext-soap": "To be able to generate mocks based on WSDL files", - "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + "ext-soap": "To be able to generate mocks based on WSDL files" }, "bin": [ "phpunit" @@ -2606,7 +3054,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "9.6-dev" + "dev-main": "11.5-dev" } }, "autoload": { @@ -2638,48 +3086,40 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.20" + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.57" }, "funding": [ { - "url": "https://phpunit.de/sponsors.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", - "type": "tidelift" + "url": "https://phpunit.de/sponsoring.html", + "type": "other" } ], - "time": "2024-07-10T11:45:39+00:00" + "time": "2026-10-05T05:47:54+00:00" }, { "name": "sebastian/cli-parser", - "version": "1.0.2", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b" + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b", - "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180", + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -2702,7 +3142,8 @@ "homepage": "https://github.com/sebastianbergmann/cli-parser", "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2" + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/3.0.2" }, "funding": [ { @@ -2710,32 +3151,32 @@ "type": "github" } ], - "time": "2024-03-02T06:27:43+00:00" + "time": "2024-07-03T04:41:36+00:00" }, { "name": "sebastian/code-unit", - "version": "1.0.8", + "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/54391c61e4af8078e5b276ab082b6d3c54c9ad64", + "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^11.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -2758,7 +3199,8 @@ "homepage": "https://github.com/sebastianbergmann/code-unit", "support": { "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + "security": "https://github.com/sebastianbergmann/code-unit/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.3" }, "funding": [ { @@ -2766,32 +3208,32 @@ "type": "github" } ], - "time": "2020-10-26T13:08:54+00:00" + "time": "2025-03-19T07:56:08+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", - "version": "2.0.3", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" + "reference": "183a9b2632194febd219bb9246eee421dad8d45e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e", + "reference": "183a9b2632194febd219bb9246eee421dad8d45e", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -2813,7 +3255,8 @@ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", "support": { "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1" }, "funding": [ { @@ -2821,34 +3264,39 @@ "type": "github" } ], - "time": "2020-09-28T05:30:19+00:00" + "time": "2024-07-03T04:45:54+00:00" }, { "name": "sebastian/comparator", - "version": "4.0.8", + "version": "6.3.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "fa0f136dd2334583309d32b62544682ee972b51a" + "reference": "2c95e1e86cb8dd41beb8d502057d1081ccc8eca9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", - "reference": "fa0f136dd2334583309d32b62544682ee972b51a", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2c95e1e86cb8dd41beb8d502057d1081ccc8eca9", + "reference": "2c95e1e86cb8dd41beb8d502057d1081ccc8eca9", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/diff": "^4.0", - "sebastian/exporter": "^4.0" + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.2", + "sebastian/diff": "^6.0", + "sebastian/exporter": "^6.0" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^11.4" + }, + "suggest": { + "ext-bcmath": "For comparing BcMath\\Number objects" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "6.3-dev" } }, "autoload": { @@ -2887,41 +3335,54 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.3" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator", + "type": "tidelift" } ], - "time": "2022-09-14T12:41:17+00:00" + "time": "2026-01-24T09:26:40+00:00" }, { "name": "sebastian/complexity", - "version": "2.0.3", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", - "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0", + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0", "shasum": "" }, "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=7.3" + "nikic/php-parser": "^5.0", + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -2944,7 +3405,8 @@ "homepage": "https://github.com/sebastianbergmann/complexity", "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3" + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/4.0.1" }, "funding": [ { @@ -2952,33 +3414,33 @@ "type": "github" } ], - "time": "2023-12-22T06:19:30+00:00" + "time": "2024-07-03T04:49:50+00:00" }, { "name": "sebastian/diff", - "version": "4.0.6", + "version": "6.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", - "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544", + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^9.3", + "phpunit/phpunit": "^11.0", "symfony/process": "^4.2 || ^5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -3010,7 +3472,8 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/6.0.2" }, "funding": [ { @@ -3018,27 +3481,27 @@ "type": "github" } ], - "time": "2024-03-02T06:30:58+00:00" + "time": "2024-07-03T04:53:05+00:00" }, { "name": "sebastian/environment", - "version": "5.1.5", + "version": "7.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" + "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", - "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/a5c75038693ad2e8d4b6c15ba2403532647830c4", + "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^11.3" }, "suggest": { "ext-posix": "*" @@ -3046,7 +3509,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.1-dev" + "dev-main": "7.2-dev" } }, "autoload": { @@ -3065,7 +3528,7 @@ } ], "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", + "homepage": "https://github.com/sebastianbergmann/environment", "keywords": [ "Xdebug", "environment", @@ -3073,42 +3536,55 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/7.2.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/environment", + "type": "tidelift" } ], - "time": "2023-02-03T06:03:51+00:00" + "time": "2025-05-21T11:55:47+00:00" }, { "name": "sebastian/exporter", - "version": "4.0.6", + "version": "6.3.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72" + "reference": "70a298763b40b213ec087c51c739efcaa90bcd74" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72", - "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/70a298763b40b213ec087c51c739efcaa90bcd74", + "reference": "70a298763b40b213ec087c51c739efcaa90bcd74", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/recursion-context": "^4.0" + "ext-mbstring": "*", + "php": ">=8.2", + "sebastian/recursion-context": "^6.0" }, "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^11.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "6.3-dev" } }, "autoload": { @@ -3150,46 +3626,56 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6" + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.2" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter", + "type": "tidelift" } ], - "time": "2024-03-02T06:33:00+00:00" + "time": "2025-09-24T06:12:51+00:00" }, { "name": "sebastian/global-state", - "version": "5.0.7", + "version": "7.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9" + "reference": "3be331570a721f9a4b5917f4209773de17f747d7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", - "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7", + "reference": "3be331570a721f9a4b5917f4209773de17f747d7", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" }, "require-dev": { "ext-dom": "*", - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-uopz": "*" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0-dev" + "dev-main": "7.0-dev" } }, "autoload": { @@ -3208,13 +3694,14 @@ } ], "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", "keywords": [ "global state" ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7" + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/7.0.2" }, "funding": [ { @@ -3222,33 +3709,33 @@ "type": "github" } ], - "time": "2024-03-02T06:35:11+00:00" + "time": "2024-07-03T04:57:36+00:00" }, { "name": "sebastian/lines-of-code", - "version": "1.0.4", + "version": "3.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", - "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a", "shasum": "" }, "require": { - "nikic/php-parser": "^4.18 || ^5.0", - "php": ">=7.3" + "nikic/php-parser": "^5.0", + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-main": "3.0-dev" } }, "autoload": { @@ -3271,7 +3758,8 @@ "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4" + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/3.0.1" }, "funding": [ { @@ -3279,34 +3767,34 @@ "type": "github" } ], - "time": "2023-12-22T06:20:34+00:00" + "time": "2024-07-03T04:58:38+00:00" }, { "name": "sebastian/object-enumerator", - "version": "4.0.4", + "version": "6.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" + "reference": "f5b498e631a74204185071eb41f33f38d64608aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa", + "reference": "f5b498e631a74204185071eb41f33f38d64608aa", "shasum": "" }, "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -3328,7 +3816,8 @@ "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1" }, "funding": [ { @@ -3336,32 +3825,32 @@ "type": "github" } ], - "time": "2020-10-26T13:12:34+00:00" + "time": "2024-07-03T05:00:13+00:00" }, { "name": "sebastian/object-reflector", - "version": "2.0.4", + "version": "4.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^11.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-main": "4.0-dev" } }, "autoload": { @@ -3383,7 +3872,8 @@ "homepage": "https://github.com/sebastianbergmann/object-reflector/", "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.1" }, "funding": [ { @@ -3391,32 +3881,32 @@ "type": "github" } ], - "time": "2020-10-26T13:14:26+00:00" + "time": "2024-07-03T05:01:32+00:00" }, { "name": "sebastian/recursion-context", - "version": "4.0.5", + "version": "6.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" + "reference": "f6458abbf32a6c8174f8f26261475dc133b3d9dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", - "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/f6458abbf32a6c8174f8f26261475dc133b3d9dc", + "reference": "f6458abbf32a6c8174f8f26261475dc133b3d9dc", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^11.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-main": "6.0-dev" } }, "autoload": { @@ -3446,94 +3936,53 @@ "homepage": "https://github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" + "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.3" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" - } - ], - "time": "2023-02-03T06:07:39+00:00" - }, - { - "name": "sebastian/resource-operations", - "version": "3.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", - "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ + }, { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "support": { - "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4" - }, - "funding": [ + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, { - "url": "https://github.com/sebastianbergmann", - "type": "github" + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context", + "type": "tidelift" } ], - "time": "2024-03-14T16:00:52+00:00" + "time": "2025-08-13T04:42:22+00:00" }, { "name": "sebastian/type", - "version": "3.2.1", + "version": "5.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" + "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", - "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/f77d2d4e78738c98d9a68d2596fe5e8fa380f449", + "reference": "f77d2d4e78738c98d9a68d2596fe5e8fa380f449", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^9.5" + "phpunit/phpunit": "^11.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2-dev" + "dev-main": "5.1-dev" } }, "autoload": { @@ -3556,37 +4005,50 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" + "security": "https://github.com/sebastianbergmann/type/security/policy", + "source": "https://github.com/sebastianbergmann/type/tree/5.1.3" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/type", + "type": "tidelift" } ], - "time": "2023-02-03T06:13:03+00:00" + "time": "2025-08-09T06:55:48+00:00" }, { "name": "sebastian/version", - "version": "3.0.2", + "version": "5.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c6c1022351a901512170118436c764e473f6de8c" + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", - "reference": "c6c1022351a901512170118436c764e473f6de8c", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874", + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874", "shasum": "" }, "require": { - "php": ">=7.3" + "php": ">=8.2" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-main": "5.0-dev" } }, "autoload": { @@ -3609,7 +4071,8 @@ "homepage": "https://github.com/sebastianbergmann/version", "support": { "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + "security": "https://github.com/sebastianbergmann/version/security/policy", + "source": "https://github.com/sebastianbergmann/version/tree/5.0.2" }, "funding": [ { @@ -3617,20 +4080,20 @@ "type": "github" } ], - "time": "2020-09-28T06:39:44+00:00" + "time": "2024-10-09T05:16:32+00:00" }, { "name": "squizlabs/php_codesniffer", - "version": "3.10.2", + "version": "3.13.6", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "86e5f5dd9a840c46810ebe5ff1885581c42a3017" + "reference": "4c378e1a528ea066890fc2397cbdd2f94eb2fc91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/86e5f5dd9a840c46810ebe5ff1885581c42a3017", - "reference": "86e5f5dd9a840c46810ebe5ff1885581c42a3017", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/4c378e1a528ea066890fc2397cbdd2f94eb2fc91", + "reference": "4c378e1a528ea066890fc2397cbdd2f94eb2fc91", "shasum": "" }, "require": { @@ -3647,11 +4110,6 @@ "bin/phpcs" ], "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, "notification-url": "https://packagist.org/downloads/", "license": [ "BSD-3-Clause" @@ -3695,110 +4153,115 @@ { "url": "https://opencollective.com/php_codesniffer", "type": "open_collective" + }, + { + "url": "https://thanks.dev/u/gh/phpcsstandards", + "type": "thanks_dev" } ], - "time": "2024-07-21T23:26:44+00:00" + "time": "2026-08-06T00:17:32+00:00" }, { - "name": "theseer/tokenizer", - "version": "1.2.3", + "name": "staabm/side-effects-detector", + "version": "1.0.5", "source": { "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + "url": "https://github.com/staabm/side-effects-detector.git", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163", "shasum": "" }, "require": { - "ext-dom": "*", "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.6", + "phpunit/phpunit": "^9.6.21", + "symfony/var-dumper": "^5.4.43", + "tomasvotruba/type-coverage": "1.0.0", + "tomasvotruba/unused-public": "1.0.0" }, "type": "library", "autoload": { "classmap": [ - "src/" + "lib/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "BSD-3-Clause" + "MIT" ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - } + "description": "A static analysis tool to detect side effects in PHP code", + "keywords": [ + "static analysis" ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { - "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + "issues": "https://github.com/staabm/side-effects-detector/issues", + "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" }, "funding": [ { - "url": "https://github.com/theseer", + "url": "https://github.com/staabm", "type": "github" } ], - "time": "2024-03-03T12:36:25+00:00" + "time": "2024-10-20T05:08:20+00:00" }, { - "name": "timeweb/phpstan-enum", - "version": "v3.1.1", + "name": "theseer/tokenizer", + "version": "1.3.1", "source": { "type": "git", - "url": "https://github.com/timeweb/phpstan-enum.git", - "reference": "72f54c981431039ee194ffdf46e8340fea49195a" + "url": "https://github.com/theseer/tokenizer.git", + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/timeweb/phpstan-enum/zipball/72f54c981431039ee194ffdf46e8340fea49195a", - "reference": "72f54c981431039ee194ffdf46e8340fea49195a", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b7489ce515e168639d17feec34b8847c326b0b3c", + "reference": "b7489ce515e168639d17feec34b8847c326b0b3c", "shasum": "" }, "require": { - "myclabs/php-enum": "^1.2", - "php": "^7.1|^8.0", - "phpstan/phpstan": "^1.0" - }, - "require-dev": { - "phpunit/phpunit": "^7.0|^9.0" - }, - "type": "phpstan-extension", - "extra": { - "phpstan": { - "includes": [ - "extension.neon", - "rules.neon" - ] - } + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" }, + "type": "library", "autoload": { - "psr-4": { - "Timeweb\\PHPStan\\": "src/" - } + "classmap": [ + "src/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], - "description": "Enum class reflection extension for PHPStan", - "keywords": [ - "PHPStan", - "enum" + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { - "issues": "https://github.com/timeweb/phpstan-enum/issues", - "source": "https://github.com/timeweb/phpstan-enum/tree/v3.1.1" + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.3.1" }, - "time": "2022-10-17T05:55:05+00:00" + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2025-11-17T20:03:58+00:00" } ], "aliases": [], @@ -3809,8 +4272,8 @@ "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": "^8.0" + "php": ">=8.2" }, - "platform-dev": [], - "plugin-api-version": "2.3.0" + "platform-dev": {}, + "plugin-api-version": "2.9.0" } From 483d4f72161accbd49fb62818f363ebbc8793c8c Mon Sep 17 00:00:00 2001 From: Aydin Hassan Date: Thu, 22 Oct 2026 22:10:30 +0200 Subject: [PATCH 16/27] Require php-workshop dev-master and lock for PHP 8.2 Co-Authored-By: Claude Opus 5.5 --- composer.json | 9 ++++++-- composer.lock | 63 +++++++++++++++++++++++++++------------------------ 2 files changed, 40 insertions(+), 32 deletions(-) diff --git a/composer.json b/composer.json index f9aa3f6..ee39ef7 100644 --- a/composer.json +++ b/composer.json @@ -22,7 +22,7 @@ ], "require": { "php": ">=8.2", - "php-school/php-workshop": "dev-docker-fixes" + "php-school/php-workshop": "dev-master" }, "require-dev": { "phpunit/phpunit": "^11.5", @@ -58,5 +58,10 @@ }, "bin": [ "bin/php8appreciate" - ] + ], + "config": { + "platform": { + "php": "8.2.0" + } + } } diff --git a/composer.lock b/composer.lock index ba01afa..b1843cf 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "e477df64354f1684dcb4a563642ee5e2", + "content-hash": "e9e6bb380cf3f4172efee39ee4e0ca8d", "packages": [ { "name": "beberlei/assert", @@ -1253,16 +1253,16 @@ }, { "name": "php-school/cli-md-renderer", - "version": "2.0.0", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/php-school/cli-md-renderer.git", - "reference": "6254a3d486f9dcf120a06fd10fcd85b3ff2bc8fb" + "reference": "6b7cfa63b268866aa78da3612cf75c7a6e78f1b2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-school/cli-md-renderer/zipball/6254a3d486f9dcf120a06fd10fcd85b3ff2bc8fb", - "reference": "6254a3d486f9dcf120a06fd10fcd85b3ff2bc8fb", + "url": "https://api.github.com/repos/php-school/cli-md-renderer/zipball/6b7cfa63b268866aa78da3612cf75c7a6e78f1b2", + "reference": "6b7cfa63b268866aa78da3612cf75c7a6e78f1b2", "shasum": "" }, "require": { @@ -1295,9 +1295,9 @@ ], "description": "A CLI Markdown Render for league/commonmark compatible AST", "support": { - "source": "https://github.com/php-school/cli-md-renderer/tree/2.0.0" + "source": "https://github.com/php-school/cli-md-renderer/tree/2.0.1" }, - "time": "2026-10-22T12:41:24+00:00" + "time": "2026-10-22T19:29:37+00:00" }, { "name": "php-school/cli-menu", @@ -1417,16 +1417,16 @@ }, { "name": "php-school/php-workshop", - "version": "dev-docker-fixes", + "version": "dev-master", "source": { "type": "git", "url": "https://github.com/php-school/php-workshop.git", - "reference": "cfd75436bb91c91fb2795a0b598480ddb15db71e" + "reference": "0c5a98369c317d6b8a67740bd6e8b6260832ede4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-school/php-workshop/zipball/cfd75436bb91c91fb2795a0b598480ddb15db71e", - "reference": "cfd75436bb91c91fb2795a0b598480ddb15db71e", + "url": "https://api.github.com/repos/php-school/php-workshop/zipball/0c5a98369c317d6b8a67740bd6e8b6260832ede4", + "reference": "0c5a98369c317d6b8a67740bd6e8b6260832ede4", "shasum": "" }, "require": { @@ -1439,7 +1439,7 @@ "nikic/php-parser": "^5.0", "php": "^8.2", "php-di/php-di": "^6.4 | ^7.0", - "php-school/cli-md-renderer": "^2.0", + "php-school/cli-md-renderer": "^2.0.1", "php-school/cli-menu": "^4.5", "php-school/keylighter": "^0.8.5", "psr/container": "^1.1 | ^2.0", @@ -1455,6 +1455,7 @@ "phpstan/phpstan": "^2.1", "phpunit/phpunit": "^11.5" }, + "default-branch": true, "type": "library", "extra": { "bamarni-bin": { @@ -1499,9 +1500,9 @@ ], "support": { "issues": "https://github.com/php-school/php-workshop/issues", - "source": "https://github.com/php-school/php-workshop/tree/docker-fixes" + "source": "https://github.com/php-school/php-workshop/tree/master" }, - "time": "2026-10-22T15:29:57+00:00" + "time": "2026-10-22T20:06:14+00:00" }, { "name": "php-school/terminal", @@ -1945,26 +1946,25 @@ }, { "name": "symfony/filesystem", - "version": "v8.1.9", + "version": "v7.4.21", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "43d109c803d22c00bb820ed45df250b6a8792ca2" + "reference": "fd0e3462be6d32a0d130e8423e4940a7688162d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/43d109c803d22c00bb820ed45df250b6a8792ca2", - "reference": "43d109c803d22c00bb820ed45df250b6a8792ca2", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/fd0e3462be6d32a0d130e8423e4940a7688162d8", + "reference": "fd0e3462be6d32a0d130e8423e4940a7688162d8", "shasum": "" }, "require": { - "php": ">=8.4.1", - "symfony/deprecation-contracts": "^2.5|^3", + "php": ">=8.2", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.8" }, "require-dev": { - "symfony/process": "^7.4|^8.0" + "symfony/process": "^6.4|^7.0|^8.0" }, "type": "library", "autoload": { @@ -1992,7 +1992,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v8.1.9" + "source": "https://github.com/symfony/filesystem/tree/v7.4.21" }, "funding": [ { @@ -2012,7 +2012,7 @@ "type": "tidelift" } ], - "time": "2026-10-06T20:05:50+00:00" + "time": "2026-10-06T20:05:19+00:00" }, { "name": "symfony/polyfill-ctype", @@ -2348,20 +2348,20 @@ }, { "name": "symfony/process", - "version": "v8.1.9", + "version": "v7.4.21", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "59a682fd049b2d4d37c444f5ac21b7d01b8c7189" + "reference": "e5247f4a5e0797d232ad8e8e6803aeb341843c83" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/59a682fd049b2d4d37c444f5ac21b7d01b8c7189", - "reference": "59a682fd049b2d4d37c444f5ac21b7d01b8c7189", + "url": "https://api.github.com/repos/symfony/process/zipball/e5247f4a5e0797d232ad8e8e6803aeb341843c83", + "reference": "e5247f4a5e0797d232ad8e8e6803aeb341843c83", "shasum": "" }, "require": { - "php": ">=8.4.1" + "php": ">=8.2" }, "type": "library", "autoload": { @@ -2389,7 +2389,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v8.1.9" + "source": "https://github.com/symfony/process/tree/v7.4.21" }, "funding": [ { @@ -2409,7 +2409,7 @@ "type": "tidelift" } ], - "time": "2026-10-08T16:57:43+00:00" + "time": "2026-10-08T16:56:12+00:00" } ], "packages-dev": [ @@ -4275,5 +4275,8 @@ "php": ">=8.2" }, "platform-dev": {}, + "platform-overrides": { + "php": "8.2.0" + }, "plugin-api-version": "2.9.0" } From 5abaae387c95bda587e86c2e367108e71c4982e8 Mon Sep 17 00:00:00 2001 From: Aydin Hassan Date: Thu, 22 Oct 2026 22:17:24 +0200 Subject: [PATCH 17/27] Drop the error handler tearDown, php-workshop restores it now Co-Authored-By: Claude Opus 5.5 --- test/Exercise/AMatchMadeInHeavenTest.php | 4 ++-- test/Exercise/ASafeSpaceForNullsTest.php | 4 ++-- test/Exercise/AllMixedUpTest.php | 4 ++-- test/Exercise/CautionWithCatchesTest.php | 4 ++-- test/Exercise/HaveTheLastSayTest.php | 4 ++-- test/Exercise/InfiniteDivisionsTest.php | 4 ++-- test/Exercise/LordOfTheStringsTest.php | 4 ++-- test/Exercise/PhpGetsAPromotionTest.php | 4 ++-- test/Exercise/StringifyToDemystifyTest.php | 4 ++-- test/Exercise/TheAttributesOfSuccessTest.php | 4 ++-- test/Exercise/TheReturnOfStaticTest.php | 4 ++-- test/Exercise/ThrowAnExpressionTest.php | 4 ++-- test/Exercise/UniteTheTypesTest.php | 4 ++-- test/ExerciseTestCase.php | 18 ------------------ 14 files changed, 26 insertions(+), 44 deletions(-) delete mode 100644 test/ExerciseTestCase.php diff --git a/test/Exercise/AMatchMadeInHeavenTest.php b/test/Exercise/AMatchMadeInHeavenTest.php index 8315514..6732f99 100644 --- a/test/Exercise/AMatchMadeInHeavenTest.php +++ b/test/Exercise/AMatchMadeInHeavenTest.php @@ -7,9 +7,9 @@ use PhpSchool\PHP8Appreciate\Exercise\AMatchMadeInHeaven; use PhpSchool\PhpWorkshop\Application; use PhpSchool\PhpWorkshop\Result\Failure; -use PhpSchool\PHP8AppreciateTest\ExerciseTestCase; +use PhpSchool\PhpWorkshop\TestUtils\WorkshopExerciseTest; -class AMatchMadeInHeavenTest extends ExerciseTestCase +class AMatchMadeInHeavenTest extends WorkshopExerciseTest { public function getApplication(): Application { diff --git a/test/Exercise/ASafeSpaceForNullsTest.php b/test/Exercise/ASafeSpaceForNullsTest.php index 0f04512..98023c5 100644 --- a/test/Exercise/ASafeSpaceForNullsTest.php +++ b/test/Exercise/ASafeSpaceForNullsTest.php @@ -6,9 +6,9 @@ use PhpSchool\PhpWorkshop\Application; use PhpSchool\PhpWorkshop\Result\Failure; use PhpSchool\PhpWorkshop\Result\FileComparisonFailure; -use PhpSchool\PHP8AppreciateTest\ExerciseTestCase; +use PhpSchool\PhpWorkshop\TestUtils\WorkshopExerciseTest; -class ASafeSpaceForNullsTest extends ExerciseTestCase +class ASafeSpaceForNullsTest extends WorkshopExerciseTest { public function getExerciseClass(): string { diff --git a/test/Exercise/AllMixedUpTest.php b/test/Exercise/AllMixedUpTest.php index 984be7c..8d8bad8 100644 --- a/test/Exercise/AllMixedUpTest.php +++ b/test/Exercise/AllMixedUpTest.php @@ -7,9 +7,9 @@ use PhpSchool\PhpWorkshop\Result\Failure; use PhpSchool\PhpWorkshop\Result\FileComparisonFailure; use PhpSchool\PhpWorkshop\Result\FunctionRequirementsFailure; -use PhpSchool\PHP8AppreciateTest\ExerciseTestCase; +use PhpSchool\PhpWorkshop\TestUtils\WorkshopExerciseTest; -class AllMixedUpTest extends ExerciseTestCase +class AllMixedUpTest extends WorkshopExerciseTest { public function getExerciseClass(): string { diff --git a/test/Exercise/CautionWithCatchesTest.php b/test/Exercise/CautionWithCatchesTest.php index aaa21f7..fcfb6fb 100644 --- a/test/Exercise/CautionWithCatchesTest.php +++ b/test/Exercise/CautionWithCatchesTest.php @@ -7,9 +7,9 @@ use PhpSchool\PHP8Appreciate\Exercise\CautionWithCatches; use PhpSchool\PhpWorkshop\Application; use PhpSchool\PhpWorkshop\Result\Failure; -use PhpSchool\PHP8AppreciateTest\ExerciseTestCase; +use PhpSchool\PhpWorkshop\TestUtils\WorkshopExerciseTest; -class CautionWithCatchesTest extends ExerciseTestCase +class CautionWithCatchesTest extends WorkshopExerciseTest { public function getExerciseClass(): string { diff --git a/test/Exercise/HaveTheLastSayTest.php b/test/Exercise/HaveTheLastSayTest.php index 3be1bad..7c13dac 100644 --- a/test/Exercise/HaveTheLastSayTest.php +++ b/test/Exercise/HaveTheLastSayTest.php @@ -9,9 +9,9 @@ use PhpSchool\PhpWorkshop\Application; use PhpSchool\PhpWorkshop\Result\Failure; use PhpSchool\PhpWorkshop\Result\FunctionRequirementsFailure; -use PhpSchool\PHP8AppreciateTest\ExerciseTestCase; +use PhpSchool\PhpWorkshop\TestUtils\WorkshopExerciseTest; -class HaveTheLastSayTest extends ExerciseTestCase +class HaveTheLastSayTest extends WorkshopExerciseTest { public function getApplication(): Application { diff --git a/test/Exercise/InfiniteDivisionsTest.php b/test/Exercise/InfiniteDivisionsTest.php index 5dff171..742bd0c 100644 --- a/test/Exercise/InfiniteDivisionsTest.php +++ b/test/Exercise/InfiniteDivisionsTest.php @@ -5,9 +5,9 @@ use PhpSchool\PHP8Appreciate\Exercise\InfiniteDivisions; use PhpSchool\PhpWorkshop\Application; use PhpSchool\PhpWorkshop\Result\Failure; -use PhpSchool\PHP8AppreciateTest\ExerciseTestCase; +use PhpSchool\PhpWorkshop\TestUtils\WorkshopExerciseTest; -class InfiniteDivisionsTest extends ExerciseTestCase +class InfiniteDivisionsTest extends WorkshopExerciseTest { public function getExerciseClass(): string { diff --git a/test/Exercise/LordOfTheStringsTest.php b/test/Exercise/LordOfTheStringsTest.php index 7629790..60ce21e 100644 --- a/test/Exercise/LordOfTheStringsTest.php +++ b/test/Exercise/LordOfTheStringsTest.php @@ -7,9 +7,9 @@ use PhpSchool\PhpWorkshop\Result\ComposerFailure; use PhpSchool\PhpWorkshop\Result\Failure; use PhpSchool\PhpWorkshop\Result\FunctionRequirementsFailure; -use PhpSchool\PHP8AppreciateTest\ExerciseTestCase; +use PhpSchool\PhpWorkshop\TestUtils\WorkshopExerciseTest; -class LordOfTheStringsTest extends ExerciseTestCase +class LordOfTheStringsTest extends WorkshopExerciseTest { public function getApplication(): Application { diff --git a/test/Exercise/PhpGetsAPromotionTest.php b/test/Exercise/PhpGetsAPromotionTest.php index e779abb..1c4f87e 100644 --- a/test/Exercise/PhpGetsAPromotionTest.php +++ b/test/Exercise/PhpGetsAPromotionTest.php @@ -7,9 +7,9 @@ use PhpSchool\PHP8Appreciate\Exercise\PhpGetsAPromotion; use PhpSchool\PhpWorkshop\Application; use PhpSchool\PhpWorkshop\Result\Failure; -use PhpSchool\PHP8AppreciateTest\ExerciseTestCase; +use PhpSchool\PhpWorkshop\TestUtils\WorkshopExerciseTest; -class PhpGetsAPromotionTest extends ExerciseTestCase +class PhpGetsAPromotionTest extends WorkshopExerciseTest { public function getExerciseClass(): string { diff --git a/test/Exercise/StringifyToDemystifyTest.php b/test/Exercise/StringifyToDemystifyTest.php index 4951b33..129c4a2 100644 --- a/test/Exercise/StringifyToDemystifyTest.php +++ b/test/Exercise/StringifyToDemystifyTest.php @@ -8,9 +8,9 @@ use PhpSchool\PhpWorkshop\Application; use PhpSchool\PhpWorkshop\Result\Failure; use PhpSchool\PhpWorkshop\Result\FunctionRequirementsFailure; -use PhpSchool\PHP8AppreciateTest\ExerciseTestCase; +use PhpSchool\PhpWorkshop\TestUtils\WorkshopExerciseTest; -class StringifyToDemystifyTest extends ExerciseTestCase +class StringifyToDemystifyTest extends WorkshopExerciseTest { public function getExerciseClass(): string { diff --git a/test/Exercise/TheAttributesOfSuccessTest.php b/test/Exercise/TheAttributesOfSuccessTest.php index bd5f143..6c1e42a 100644 --- a/test/Exercise/TheAttributesOfSuccessTest.php +++ b/test/Exercise/TheAttributesOfSuccessTest.php @@ -8,9 +8,9 @@ use PhpSchool\PhpWorkshop\Result\Failure; use PhpSchool\PhpWorkshop\Result\FileComparisonFailure; use PhpSchool\PhpWorkshop\Result\FunctionRequirementsFailure; -use PhpSchool\PHP8AppreciateTest\ExerciseTestCase; +use PhpSchool\PhpWorkshop\TestUtils\WorkshopExerciseTest; -class TheAttributesOfSuccessTest extends ExerciseTestCase +class TheAttributesOfSuccessTest extends WorkshopExerciseTest { public function getExerciseClass(): string { diff --git a/test/Exercise/TheReturnOfStaticTest.php b/test/Exercise/TheReturnOfStaticTest.php index a2a619f..a964f4a 100644 --- a/test/Exercise/TheReturnOfStaticTest.php +++ b/test/Exercise/TheReturnOfStaticTest.php @@ -5,9 +5,9 @@ use PhpSchool\PHP8Appreciate\Exercise\TheReturnOfStatic; use PhpSchool\PhpWorkshop\Application; use PhpSchool\PhpWorkshop\Result\Failure; -use PhpSchool\PHP8AppreciateTest\ExerciseTestCase; +use PhpSchool\PhpWorkshop\TestUtils\WorkshopExerciseTest; -class TheReturnOfStaticTest extends ExerciseTestCase +class TheReturnOfStaticTest extends WorkshopExerciseTest { public function getExerciseClass(): string { diff --git a/test/Exercise/ThrowAnExpressionTest.php b/test/Exercise/ThrowAnExpressionTest.php index 0b58b85..161748d 100644 --- a/test/Exercise/ThrowAnExpressionTest.php +++ b/test/Exercise/ThrowAnExpressionTest.php @@ -8,9 +8,9 @@ use PhpSchool\PhpWorkshop\Result\Cgi\RequestFailure; use PhpSchool\PhpWorkshop\Result\Cgi\Success; use PhpSchool\PhpWorkshop\Result\Failure; -use PhpSchool\PHP8AppreciateTest\ExerciseTestCase; +use PhpSchool\PhpWorkshop\TestUtils\WorkshopExerciseTest; -class ThrowAnExpressionTest extends ExerciseTestCase +class ThrowAnExpressionTest extends WorkshopExerciseTest { public function getExerciseClass(): string { diff --git a/test/Exercise/UniteTheTypesTest.php b/test/Exercise/UniteTheTypesTest.php index 5ff2fa9..11dfd17 100644 --- a/test/Exercise/UniteTheTypesTest.php +++ b/test/Exercise/UniteTheTypesTest.php @@ -5,9 +5,9 @@ use PhpSchool\PHP8Appreciate\Exercise\UniteTheTypes; use PhpSchool\PhpWorkshop\Application; use PhpSchool\PhpWorkshop\Result\Failure; -use PhpSchool\PHP8AppreciateTest\ExerciseTestCase; +use PhpSchool\PhpWorkshop\TestUtils\WorkshopExerciseTest; -class UniteTheTypesTest extends ExerciseTestCase +class UniteTheTypesTest extends WorkshopExerciseTest { public function getExerciseClass(): string { diff --git a/test/ExerciseTestCase.php b/test/ExerciseTestCase.php deleted file mode 100644 index 7b80bad..0000000 --- a/test/ExerciseTestCase.php +++ /dev/null @@ -1,18 +0,0 @@ - Date: Thu, 22 Oct 2026 22:21:10 +0200 Subject: [PATCH 18/27] Lock php-workshop at current master Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011CqRqxTfcNvVkKoy8e4aG9 --- composer.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/composer.lock b/composer.lock index b1843cf..4f0827d 100644 --- a/composer.lock +++ b/composer.lock @@ -1421,12 +1421,12 @@ "source": { "type": "git", "url": "https://github.com/php-school/php-workshop.git", - "reference": "0c5a98369c317d6b8a67740bd6e8b6260832ede4" + "reference": "ae2fe2ffe8004ddfbcfd956f6fc17e398b58e19f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-school/php-workshop/zipball/0c5a98369c317d6b8a67740bd6e8b6260832ede4", - "reference": "0c5a98369c317d6b8a67740bd6e8b6260832ede4", + "url": "https://api.github.com/repos/php-school/php-workshop/zipball/ae2fe2ffe8004ddfbcfd956f6fc17e398b58e19f", + "reference": "ae2fe2ffe8004ddfbcfd956f6fc17e398b58e19f", "shasum": "" }, "require": { @@ -1502,7 +1502,7 @@ "issues": "https://github.com/php-school/php-workshop/issues", "source": "https://github.com/php-school/php-workshop/tree/master" }, - "time": "2026-10-22T20:06:14+00:00" + "time": "2026-10-22T20:18:08+00:00" }, { "name": "php-school/terminal", From 9a7b12cd6ef30e46baa4fceda8acbac1eb708612 Mon Sep 17 00:00:00 2001 From: Aydin Hassan Date: Thu, 22 Oct 2026 22:28:30 +0200 Subject: [PATCH 19/27] Name the test suite after the workshop Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011CqRqxTfcNvVkKoy8e4aG9 --- phpunit.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpunit.xml b/phpunit.xml index 0debfcf..a45fd2b 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -1,6 +1,6 @@ - + ./test ./test/solutions From d56d77e0e8270cfd7693188a99708ac7bdf5d4b0 Mon Sep 17 00:00:00 2001 From: Aydin Hassan Date: Thu, 22 Oct 2026 22:31:17 +0200 Subject: [PATCH 20/27] CI: match learn-you-php's build workflow Runs on PRs to any branch and builds the runtime image before the docker tests. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011CqRqxTfcNvVkKoy8e4aG9 --- .docker/runtime/Dockerfile | 4 ++-- .github/workflows/build.yml | 25 ++++++++++++++----------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/.docker/runtime/Dockerfile b/.docker/runtime/Dockerfile index dc8e93f..b7f88a0 100644 --- a/.docker/runtime/Dockerfile +++ b/.docker/runtime/Dockerfile @@ -1,11 +1,11 @@ -FROM php:8.3-alpine as build +FROM php:8.3-alpine AS build RUN apk add --no-cache $PHPIZE_DEPS && \ apk add --no-cache linux-headers RUN docker-php-ext-install sockets -FROM php:8.3-alpine as final +FROM php:8.3-alpine AS final COPY --from=build /usr/local/lib/php /usr/local/lib/php COPY --from=build /usr/local/etc/php /usr/local/etc/php diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ca0fea4..10564df 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -4,18 +4,17 @@ on: push: branches: [ master ] pull_request: - branches: [ master ] jobs: build: runs-on: ubuntu-latest + timeout-minutes: 15 strategy: fail-fast: false matrix: php: ['8.2', '8.3', '8.4', '8.5'] name: PHP ${{ matrix.php }} - timeout-minutes: 20 steps: - name: Checkout uses: actions/checkout@v4 @@ -24,18 +23,22 @@ jobs: uses: shivammathur/setup-php@v2 with: php-version: ${{ matrix.php }} - tools: composer:v2,pecl - extensions: pdo_sqlite - ini-values: opcache.enable=0 + tools: composer:v2 + extensions: pdo_sqlite, sockets + coverage: none - name: Install Dependencies - run: composer update + run: composer update --prefer-dist --no-progress + + - name: Build runtime image + run: docker build -t phpunit-runtime .docker/runtime + + - name: Run phpunit tests (docker) + run: PROCESS_FACTORY=docker vendor/bin/phpunit --stop-on-error + + - name: Run phpunit tests (host) + run: PROCESS_FACTORY=host vendor/bin/phpunit --stop-on-error - - name: Run phpunit tests - run: | - mkdir -p build/logs - PROCESS_FACTORY=host vendor/bin/phpunit --stop-on-error - PROCESS_FACTORY=docker vendor/bin/phpunit --stop-on-error - name: Run phpcs run: composer cs From b8ded30060505a0d27829fcdcca855a9ea00fb64 Mon Sep 17 00:00:00 2001 From: Aydin Hassan Date: Thu, 22 Oct 2026 22:37:52 +0200 Subject: [PATCH 21/27] have-the-last-say: explain the escape argument without mentioning deprecations --- exercises/have-the-last-say/problem/problem.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/exercises/have-the-last-say/problem/problem.md b/exercises/have-the-last-say/problem/problem.md index cf1f109..9291429 100644 --- a/exercises/have-the-last-say/problem/problem.md +++ b/exercises/have-the-last-say/problem/problem.md @@ -14,7 +14,7 @@ The list of countries will be picked at random, so the CSV will be different eac When using `fgetcsv` there's a bunch of arguments which change the behaviour of the way the CSV is parsed. In our case we want to change the `separator` argument, which defaults to a comma `,`. We need it to be the pipe `|` character. -We don't want to specify the rest of the arguments, so aside from the file pointer which is the first argument, we only want to specify the `separator` argument. +We also want to set the `escape` argument to an empty string `""`, so a backslash `\` is read as a normal character. We don't want to specify the rest of the arguments, so aside from the file pointer which is the first argument, we only want to specify the `separator` and `escape` arguments. Named arguments are a great way to change argument default values without having to specify all the defaults again. @@ -47,8 +47,6 @@ You will need to open the file for writing before using `fgetcsv` you can do tha `fgetcsv` will return *one* line at a time -On PHP 8.4+ you must also pass the `escape` argument (as a named argument, e.g. `escape: ""`) to avoid a deprecation notice. This is the only extra argument allowed. - You will most likely need a loop to process all the data in the file. You will need to keep reading from the file until it has been fully read. `feof` is your friend here and will inform you whether there is any data left to read. From ce87892bec028a7d6b75134dfe28c7537e21bcf6 Mon Sep 17 00:00:00 2001 From: Aydin Hassan Date: Tue, 27 Oct 2026 18:25:55 +0100 Subject: [PATCH 22/27] Rename PROCESS_FACTORY to SANDBOX and update php-workshop --- .github/workflows/build.yml | 4 ++-- composer.lock | 8 ++++---- phpunit.xml | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 10564df..bcbdd49 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -34,10 +34,10 @@ jobs: run: docker build -t phpunit-runtime .docker/runtime - name: Run phpunit tests (docker) - run: PROCESS_FACTORY=docker vendor/bin/phpunit --stop-on-error + run: SANDBOX=docker vendor/bin/phpunit --stop-on-error - name: Run phpunit tests (host) - run: PROCESS_FACTORY=host vendor/bin/phpunit --stop-on-error + run: SANDBOX=host vendor/bin/phpunit --stop-on-error - name: Run phpcs run: composer cs diff --git a/composer.lock b/composer.lock index 4f0827d..081941e 100644 --- a/composer.lock +++ b/composer.lock @@ -1421,12 +1421,12 @@ "source": { "type": "git", "url": "https://github.com/php-school/php-workshop.git", - "reference": "ae2fe2ffe8004ddfbcfd956f6fc17e398b58e19f" + "reference": "661e7d866d72236de1dec09cd4864911b222fbb8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-school/php-workshop/zipball/ae2fe2ffe8004ddfbcfd956f6fc17e398b58e19f", - "reference": "ae2fe2ffe8004ddfbcfd956f6fc17e398b58e19f", + "url": "https://api.github.com/repos/php-school/php-workshop/zipball/661e7d866d72236de1dec09cd4864911b222fbb8", + "reference": "661e7d866d72236de1dec09cd4864911b222fbb8", "shasum": "" }, "require": { @@ -1502,7 +1502,7 @@ "issues": "https://github.com/php-school/php-workshop/issues", "source": "https://github.com/php-school/php-workshop/tree/master" }, - "time": "2026-10-22T20:18:08+00:00" + "time": "2026-10-27T17:20:01+00:00" }, { "name": "php-school/terminal", diff --git a/phpunit.xml b/phpunit.xml index a45fd2b..b52cbdd 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -10,6 +10,6 @@ - + From d741a5261fa7781edae38b06b9fe2a3327483cef Mon Sep 17 00:00:00 2001 From: Aydin Hassan Date: Tue, 27 Oct 2026 18:35:30 +0100 Subject: [PATCH 23/27] Create /solution and /composer in the runtime image, for the composer cache volume --- .docker/runtime/Dockerfile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.docker/runtime/Dockerfile b/.docker/runtime/Dockerfile index b7f88a0..31e41a4 100644 --- a/.docker/runtime/Dockerfile +++ b/.docker/runtime/Dockerfile @@ -11,4 +11,6 @@ COPY --from=build /usr/local/lib/php /usr/local/lib/php COPY --from=build /usr/local/etc/php /usr/local/etc/php RUN apk add git -RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer \ No newline at end of file +RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer +#owned by whichever user the sandbox runs as. /composer seeds the composer cache volume +RUN mkdir -m 1777 /solution /composer From b37cc841623681597dd378a3bb18a67603588b76 Mon Sep 17 00:00:00 2001 From: Aydin Hassan Date: Tue, 27 Oct 2026 20:07:37 +0100 Subject: [PATCH 24/27] Warm the reference packages cache on composer install and update --- composer.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/composer.json b/composer.json index ee39ef7..b686d84 100644 --- a/composer.json +++ b/composer.json @@ -40,6 +40,8 @@ } }, "scripts": { + "post-install-cmd": "@php bin/php8appreciate warm-cache", + "post-update-cmd": "@php bin/php8appreciate warm-cache", "test": [ "@unit-tests", "@cs", From 07a33aa8d9e10923c7fdeffa4c4f0ece5ce7b6d8 Mon Sep 17 00:00:00 2001 From: Aydin Hassan Date: Tue, 27 Oct 2026 20:28:48 +0100 Subject: [PATCH 25/27] Update php-workshop for ReferencePackages --- composer.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/composer.lock b/composer.lock index 081941e..91ffc05 100644 --- a/composer.lock +++ b/composer.lock @@ -1421,12 +1421,12 @@ "source": { "type": "git", "url": "https://github.com/php-school/php-workshop.git", - "reference": "661e7d866d72236de1dec09cd4864911b222fbb8" + "reference": "2d7c13306a68883461b18d0b5b7fc7e628190abb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-school/php-workshop/zipball/661e7d866d72236de1dec09cd4864911b222fbb8", - "reference": "661e7d866d72236de1dec09cd4864911b222fbb8", + "url": "https://api.github.com/repos/php-school/php-workshop/zipball/2d7c13306a68883461b18d0b5b7fc7e628190abb", + "reference": "2d7c13306a68883461b18d0b5b7fc7e628190abb", "shasum": "" }, "require": { @@ -1502,7 +1502,7 @@ "issues": "https://github.com/php-school/php-workshop/issues", "source": "https://github.com/php-school/php-workshop/tree/master" }, - "time": "2026-10-27T17:20:01+00:00" + "time": "2026-10-27T19:25:43+00:00" }, { "name": "php-school/terminal", From 98428c32d09cbb2f0d3ed4ef63a30b0b391193ed Mon Sep 17 00:00:00 2001 From: Aydin Hassan Date: Tue, 27 Oct 2026 20:45:21 +0100 Subject: [PATCH 26/27] Create /solution/vendor in the runtime image, for the vendor volume --- .docker/runtime/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.docker/runtime/Dockerfile b/.docker/runtime/Dockerfile index 31e41a4..423953e 100644 --- a/.docker/runtime/Dockerfile +++ b/.docker/runtime/Dockerfile @@ -12,5 +12,5 @@ COPY --from=build /usr/local/etc/php /usr/local/etc/php RUN apk add git RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer -#owned by whichever user the sandbox runs as. /composer seeds the composer cache volume -RUN mkdir -m 1777 /solution /composer +#owned by whichever user the sandbox runs as. /composer and /solution/vendor seed their volumes +RUN mkdir -m 1777 /solution /solution/vendor /composer From 3a9941564a746647cfbe12837610899fe7778a96 Mon Sep 17 00:00:00 2001 From: Aydin Hassan Date: Sun, 1 Nov 2026 20:36:02 +0100 Subject: [PATCH 27/27] chore: drop the unused sandbox mkdirs from the runtime image (#51) --- .docker/runtime/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.docker/runtime/Dockerfile b/.docker/runtime/Dockerfile index 423953e..5c1eec0 100644 --- a/.docker/runtime/Dockerfile +++ b/.docker/runtime/Dockerfile @@ -12,5 +12,5 @@ COPY --from=build /usr/local/etc/php /usr/local/etc/php RUN apk add git RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer -#owned by whichever user the sandbox runs as. /composer and /solution/vendor seed their volumes -RUN mkdir -m 1777 /solution /solution/vendor /composer +#the solution is copied in here. Writable by whichever user the sandbox runs as, eg. for files the code writes +RUN mkdir -m 1777 /solution