diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bdb36953a..ffd3929fa 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,6 +8,7 @@ name: CI env: COMPOSER_ROOT_VERSION: 12.4.x-dev + PHP_VERSION: 8.4 jobs: coding-guidelines: @@ -17,12 +18,23 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 + with: + fetch-depth: 1 + ref: ${{ github.event.pull_request.head.sha || github.sha }} + + - name: Use local branch + shell: bash + run: | + BRANCH=$([ "${{ github.event_name }}" == "pull_request" ] && echo "${{ github.head_ref }}" || echo "${{ github.ref_name }}") + git branch -D $BRANCH 2>/dev/null || true + git branch $BRANCH HEAD + git checkout $BRANCH - name: Install PHP uses: shivammathur/setup-php@v2 with: - php-version: 8.3 + php-version: ${{ env.PHP_VERSION }} extensions: none, iconv, json, phar, tokenizer coverage: none tools: none @@ -37,17 +49,41 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 + with: + fetch-depth: 1 + ref: ${{ github.event.pull_request.head.sha || github.sha }} + + - name: Use local branch + shell: bash + run: | + BRANCH=$([ "${{ github.event_name }}" == "pull_request" ] && echo "${{ github.head_ref }}" || echo "${{ github.ref_name }}") + git branch -D $BRANCH 2>/dev/null || true + git branch $BRANCH HEAD + git checkout $BRANCH - name: Install PHP uses: shivammathur/setup-php@v2 with: - php-version: 8.4 + php-version: ${{ env.PHP_VERSION }} extensions: none, ctype, curl, dom, iconv, mbstring, opcache, simplexml, tokenizer, xml, xmlwriter coverage: none tools: none - - name: Install dependencies with Composer + - name: Get Composer cache directory + id: composer-cache + shell: bash + run: | + echo "dir=$(composer config cache-files-dir)" >> "$GITHUB_OUTPUT" + + - name: Cache Composer cache directory + uses: actions/cache@v4 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} + restore-keys: ${{ runner.os }}-composer- + + - name: Update dependencies with composer run: ./tools/composer update --no-interaction --no-ansi --no-progress - name: Run PHPStan @@ -84,7 +120,18 @@ jobs: run: git config --global core.autocrlf false - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 + with: + fetch-depth: 1 + ref: ${{ github.event.pull_request.head.sha || github.sha }} + + - name: Use local branch + shell: bash + run: | + BRANCH=$([ "${{ github.event_name }}" == "pull_request" ] && echo "${{ github.head_ref }}" || echo "${{ github.ref_name }}") + git branch -D $BRANCH 2>/dev/null || true + git branch $BRANCH HEAD + git checkout $BRANCH - name: Install PHP with extensions uses: shivammathur/setup-php@v2 @@ -95,11 +142,24 @@ jobs: ini-values: ${{ env.PHP_INI_VALUES }} tools: none + - name: Get Composer cache directory + id: composer-cache + shell: bash + run: | + echo "dir=$(composer config cache-files-dir)" >> "$GITHUB_OUTPUT" + + - name: Cache Composer cache directory + uses: actions/cache@v4 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} + restore-keys: ${{ runner.os }}-composer- + - name: Install dependencies with Composer run: php ./tools/composer update --no-ansi --no-interaction --no-progress - name: Run tests with PHPUnit - run: ./vendor/bin/phpunit --log-junit test-results.xml --coverage-openclover=code-coverage.xml + run: vendor/bin/phpunit --log-junit test-results.xml --coverage-clover=code-coverage.xml - name: Upload test results to Codecov.io if: ${{ !cancelled() }} diff --git a/.phive/phars.xml b/.phive/phars.xml index 29fc69ba6..eb0d33ab0 100644 --- a/.phive/phars.xml +++ b/.phive/phars.xml @@ -1,5 +1,5 @@ - - + + diff --git a/src/Data/ProcessedCodeCoverageData.php b/src/Data/ProcessedCodeCoverageData.php index 57ccbb166..49a103236 100644 --- a/src/Data/ProcessedCodeCoverageData.php +++ b/src/Data/ProcessedCodeCoverageData.php @@ -38,10 +38,10 @@ * paths: array, * hit: list, - * }>, - * hit: list + * }> * } * @phpstan-type FunctionCoverageType array> + * @phpstan-type LineCoverageType array>> */ final class ProcessedCodeCoverageData { @@ -49,7 +49,7 @@ final class ProcessedCodeCoverageData * Line coverage data. * An array of filenames, each having an array of linenumbers, each executable line having an array of testcase ids. * - * @var array>> + * @var LineCoverageType */ private array $lineCoverage = []; @@ -112,11 +112,17 @@ public function markCodeAsExecutedByTestCase(string $testCaseId, RawCodeCoverage } } + /** + * @param LineCoverageType $lineCoverage + */ public function setLineCoverage(array $lineCoverage): void { $this->lineCoverage = $lineCoverage; } + /** + * @return LineCoverageType + */ public function lineCoverage(): array { ksort($this->lineCoverage); @@ -124,11 +130,17 @@ public function lineCoverage(): array return $this->lineCoverage; } + /** + * @param FunctionCoverageType $functionCoverage + */ public function setFunctionCoverage(array $functionCoverage): void { $this->functionCoverage = $functionCoverage; } + /** + * @return FunctionCoverageType + */ public function functionCoverage(): array { ksort($this->functionCoverage); @@ -136,6 +148,9 @@ public function functionCoverage(): array return $this->functionCoverage; } + /** + * @return array + */ public function coveredFiles(): array { ksort($this->lineCoverage); diff --git a/src/Node/Builder.php b/src/Node/Builder.php index 19fc3a24d..9a2efe145 100644 --- a/src/Node/Builder.php +++ b/src/Node/Builder.php @@ -140,6 +140,9 @@ private function buildDirectoryStructure(ProcessedCodeCoverageData $data): array { $result = []; + $lineCoverage = $data->lineCoverage(); + $functionCoverage = $data->functionCoverage(); + foreach ($data->coveredFiles() as $originalPath) { $path = explode(DIRECTORY_SEPARATOR, $originalPath); $pointer = &$result; @@ -156,8 +159,8 @@ private function buildDirectoryStructure(ProcessedCodeCoverageData $data): array } $pointer = [ - 'lineCoverage' => $data->lineCoverage()[$originalPath] ?? [], - 'functionCoverage' => $data->functionCoverage()[$originalPath] ?? [], + 'lineCoverage' => $lineCoverage[$originalPath] ?? [], + 'functionCoverage' => $functionCoverage[$originalPath] ?? [], ]; } @@ -203,12 +206,14 @@ private function buildDirectoryStructure(ProcessedCodeCoverageData $data): array */ private function reducePaths(ProcessedCodeCoverageData $coverage): string { - if ($coverage->coveredFiles() === []) { + $coveredFiles = $coverage->coveredFiles(); + + if ($coveredFiles === []) { return '.'; } $commonPath = ''; - $paths = $coverage->coveredFiles(); + $paths = $coveredFiles; if (count($paths) === 1) { $commonPath = dirname($paths[0]) . DIRECTORY_SEPARATOR; @@ -260,7 +265,7 @@ private function reducePaths(ProcessedCodeCoverageData $coverage): string } } - $original = $coverage->coveredFiles(); + $original = $coveredFiles; $max = count($original); for ($i = 0; $i < $max; $i++) { diff --git a/src/Report/Html/Renderer/Template/css/style.css b/src/Report/Html/Renderer/Template/css/style.css index c8a4cf7f4..4303bf844 100644 --- a/src/Report/Html/Renderer/Template/css/style.css +++ b/src/Report/Html/Renderer/Template/css/style.css @@ -2,8 +2,8 @@ :root { /* Implementing an auto-selection of dark/light theme via: https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/light-dark */ color-scheme: light dark; - - /* PHPUnit ligh/dark colors */ + + /* PHPUnit light/dark colors */ --phpunit-breadcrumbs: light-dark(var(--bs-gray-200), var(--bs-gray-800)); --phpunit-success-bar: light-dark(#28a745 ,#1f8135); --phpunit-success-high: light-dark(#99cb84, #3d5c4e); @@ -14,8 +14,8 @@ --phpunit-danger: light-dark(#f2dede, #42221e); --phpunit-danger-bar: light-dark(#dc3545, #a62633); - /* Bootstrap v5.3 default colors (ligth, dark) */ - --bs-body-bg-rgb: light-dark((255, 255, 255), (33, 37, 41)); + /* Bootstrap v5.3 default colors (light, dark) */ + --bs-body-bg-rgb: 255, 255, 255; --bs-body-bg: light-dark(#fff, #212529); --bs-body-color-rgb: light-dark(33, 37, 41, 222, 226, 230); --bs-body-color: light-dark(#212529, #dee2e6); @@ -28,7 +28,7 @@ --bs-dark-bg-subtle: light-dark(#ced4da, #1a1d20); --bs-dark-border-subtle: light-dark(#adb5bd, #343a40); --bs-dark-text-emphasis: light-dark(#495057, #dee2e6); - --bs-emphasis-color-rgb: light-dark((0, 0, 0), (255, 255, 255)); + --bs-emphasis-color-rgb: 0, 0, 0; --bs-emphasis-color: light-dark(#000, #fff); --bs-form-invalid-border-color: light-dark(#dc3545, #ea868f); --bs-form-invalid-color: light-dark(#dc3545, #ea868f); @@ -42,18 +42,18 @@ --bs-light-bg-subtle: light-dark(#fcfcfd, #343a40); --bs-light-border-subtle: light-dark(#e9ecef, #495057); --bs-light-text-emphasis: light-dark(#495057, #f8f9fa); - --bs-link-color-rgb: light-dark((13, 110, 253), (110, 168, 254)); + --bs-link-color-rgb: 13, 110, 253; --bs-link-color: light-dark(#0d6efd, #6ea8fe); - --bs-link-hover-color-rgb: light-dark((10, 88, 202), (139, 185, 254)); + --bs-link-hover-color-rgb: 10, 88, 202; --bs-link-hover-color: light-dark(#0a58ca, #8bb9fe); --bs-primary-bg-subtle: light-dark(#cfe2ff, #031633); --bs-primary-border-subtle: light-dark(#9ec5fe, #084298); --bs-primary-text-emphasis: light-dark(#052c65, #6ea8fe); - --bs-secondary-bg-rgb: light-dark((233, 236, 239), (52, 58, 64)); + --bs-secondary-bg-rgb: 233, 236, 239; --bs-secondary-bg-subtle: light-dark(#e2e3e5, #161719); --bs-secondary-bg: light-dark(#e9ecef, #343a40); --bs-secondary-border-subtle: light-dark(#c4c8cb, #41464b); - --bs-secondary-color-rgb: light-dark((33, 37, 41), (222, 226, 230)); + --bs-secondary-color-rgb: 33, 37, 41; --bs-secondary-color: light-dark(rgba(33, 37, 41, 0.75), rgba(222, 226, 230, 0.75)); --bs-secondary-text-emphasis: light-dark(#2b2f32, #a7acb1); --bs-success-bg-subtle: light-dark(#d1e7dd, #051b11); @@ -61,7 +61,7 @@ --bs-success-text-emphasis: light-dark(#0a3622, #75b798); --bs-tertiary-bg-rgb: light-dark(248, 249, 250, 43, 48, 53); --bs-tertiary-bg: light-dark(#f8f9fa, #2b3035); - --bs-tertiary-color-rgb: light-dark((33, 37, 41), (222, 226, 230)); + --bs-tertiary-color-rgb: 33, 37, 41; --bs-tertiary-color: light-dark(rgba(33, 37, 41, 0.5), rgba(222, 226, 230, 0.5)); --bs-warning-bg-subtle: light-dark(#fff3cd, #332701); --bs-warning-border-subtle: light-dark(#ffe69c, #997404); @@ -69,6 +69,16 @@ } @media (prefers-color-scheme: dark) { + :root { + --bs-body-bg-rgb: 33, 37, 41; + --bs-emphasis-color-rgb: 255, 255, 255; + --bs-link-color-rgb: 110, 168, 254; + --bs-link-hover-color-rgb: 139, 185, 254; + --bs-secondary-bg-rgb: 52, 58, 64; + --bs-secondary-color-rgb: 222, 226, 230; + --bs-tertiary-color-rgb: 222, 226, 230; + } + /* Invert icon's colors on dark mode to improve readability */ img.octicon { filter: invert(1); } } diff --git a/src/Report/Xml/Coverage.php b/src/Report/Xml/Coverage.php index afb70a069..812672081 100644 --- a/src/Report/Xml/Coverage.php +++ b/src/Report/Xml/Coverage.php @@ -10,7 +10,6 @@ namespace SebastianBergmann\CodeCoverage\Report\Xml; use DOMElement; -use SebastianBergmann\CodeCoverage\ReportAlreadyFinalizedException; use XMLWriter; /** @@ -18,48 +17,35 @@ */ final class Coverage { - private readonly XMLWriter $writer; private readonly DOMElement $contextNode; - private bool $finalized = false; + private readonly string $line; public function __construct(DOMElement $context, string $line) { $this->contextNode = $context; - - $this->writer = new XMLWriter; - $this->writer->openMemory(); - $this->writer->startElementNs(null, $context->nodeName, 'https://schema.phpunit.de/coverage/1.0'); - $this->writer->writeAttribute('nr', $line); + $this->line = $line; } - /** - * @throws ReportAlreadyFinalizedException - */ - public function addTest(string $test): void + public function finalize(array $tests): void { - if ($this->finalized) { - // @codeCoverageIgnoreStart - throw new ReportAlreadyFinalizedException; - // @codeCoverageIgnoreEnd + $writer = new XMLWriter; + $writer->openMemory(); + $writer->startElementNs(null, $this->contextNode->nodeName, 'https://schema.phpunit.de/coverage/1.0'); + $writer->writeAttribute('nr', $this->line); + + foreach ($tests as $test) { + $writer->startElement('covered'); + $writer->writeAttribute('by', $test); + $writer->endElement(); } - - $this->writer->startElement('covered'); - $this->writer->writeAttribute('by', $test); - $this->writer->endElement(); - } - - public function finalize(): void - { - $this->writer->endElement(); + $writer->endElement(); $fragment = $this->contextNode->ownerDocument->createDocumentFragment(); - $fragment->appendXML($this->writer->outputMemory()); + $fragment->appendXML($writer->outputMemory()); $this->contextNode->parentNode->replaceChild( $fragment, $this->contextNode, ); - - $this->finalized = true; } } diff --git a/src/Report/Xml/Facade.php b/src/Report/Xml/Facade.php index ba008f2ff..30c35e269 100644 --- a/src/Report/Xml/Facade.php +++ b/src/Report/Xml/Facade.php @@ -165,12 +165,7 @@ private function processFile(FileNode $file, Directory $context): void } $coverage = $fileReport->lineCoverage((string) $line); - - foreach ($tests as $test) { - $coverage->addTest($test); - } - - $coverage->finalize(); + $coverage->finalize($tests); } $fileReport->source()->setSourceCode( diff --git a/tools/.phpstan/composer.json b/tools/.phpstan/composer.json index 29d56109c..bdf002e8a 100644 --- a/tools/.phpstan/composer.json +++ b/tools/.phpstan/composer.json @@ -1,10 +1,10 @@ { "require-dev": { - "phpstan/phpstan": "^2.1.22", + "phpstan/phpstan": "^2.1.31", "phpstan/extension-installer": "^1.4.3", - "phpstan/phpstan-strict-rules": "^2.0.6", + "phpstan/phpstan-strict-rules": "^2.0.7", "tomasvotruba/type-coverage": "^2.0.2", - "ergebnis/phpstan-rules": "^2.11.0" + "ergebnis/phpstan-rules": "^2.12.0" }, "config": { "allow-plugins": { diff --git a/tools/.phpstan/composer.lock b/tools/.phpstan/composer.lock index f01a2d2b8..8ae0deb61 100644 --- a/tools/.phpstan/composer.lock +++ b/tools/.phpstan/composer.lock @@ -4,21 +4,21 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "33d32155239d1370eaa496a5fd6794c9", + "content-hash": "a9f0b67d84e6ed2e79a17f1de7c3862a", "packages": [], "packages-dev": [ { "name": "ergebnis/phpstan-rules", - "version": "2.11.0", + "version": "2.12.0", "source": { "type": "git", "url": "https://github.com/ergebnis/phpstan-rules.git", - "reference": "505fead92d89daeb6aa045e92a3e77b55f4ca6a5" + "reference": "c4e0121a937b3b551f800a86e7d78794da2783ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/phpstan-rules/zipball/505fead92d89daeb6aa045e92a3e77b55f4ca6a5", - "reference": "505fead92d89daeb6aa045e92a3e77b55f4ca6a5", + "url": "https://api.github.com/repos/ergebnis/phpstan-rules/zipball/c4e0121a937b3b551f800a86e7d78794da2783ea", + "reference": "c4e0121a937b3b551f800a86e7d78794da2783ea", "shasum": "" }, "require": { @@ -31,10 +31,9 @@ "doctrine/orm": "^2.20.0 || ^3.3.0", "ergebnis/composer-normalize": "^2.47.0", "ergebnis/license": "^2.6.0", - "ergebnis/php-cs-fixer-config": "^6.52.0", - "ergebnis/phpunit-slow-test-detector": "^2.19.1", + "ergebnis/php-cs-fixer-config": "^6.54.0", + "ergebnis/phpunit-slow-test-detector": "^2.20.0", "fakerphp/faker": "^1.24.1", - "nette/di": "^3.1.10", "phpstan/extension-installer": "^1.4.3", "phpstan/phpstan-deprecation-rules": "^2.0.3", "phpstan/phpstan-phpunit": "^2.0.7", @@ -79,7 +78,7 @@ "security": "https://github.com/ergebnis/phpstan-rules/blob/main/.github/SECURITY.md", "source": "https://github.com/ergebnis/phpstan-rules" }, - "time": "2025-08-19T07:58:25+00:00" + "time": "2025-09-07T13:31:33+00:00" }, { "name": "nette/utils", @@ -220,16 +219,11 @@ }, { "name": "phpstan/phpstan", - "version": "2.1.22", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpstan.git", - "reference": "41600c8379eb5aee63e9413fe9e97273e25d57e4" - }, + "version": "2.1.31", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/41600c8379eb5aee63e9413fe9e97273e25d57e4", - "reference": "41600c8379eb5aee63e9413fe9e97273e25d57e4", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/ead89849d879fe203ce9292c6ef5e7e76f867b96", + "reference": "ead89849d879fe203ce9292c6ef5e7e76f867b96", "shasum": "" }, "require": { @@ -274,25 +268,25 @@ "type": "github" } ], - "time": "2025-08-04T19:17:37+00:00" + "time": "2025-10-10T14:14:11+00:00" }, { "name": "phpstan/phpstan-strict-rules", - "version": "2.0.6", + "version": "2.0.7", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-strict-rules.git", - "reference": "f9f77efa9de31992a832ff77ea52eb42d675b094" + "reference": "d6211c46213d4181054b3d77b10a5c5cb0d59538" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/f9f77efa9de31992a832ff77ea52eb42d675b094", - "reference": "f9f77efa9de31992a832ff77ea52eb42d675b094", + "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/d6211c46213d4181054b3d77b10a5c5cb0d59538", + "reference": "d6211c46213d4181054b3d77b10a5c5cb0d59538", "shasum": "" }, "require": { "php": "^7.4 || ^8.0", - "phpstan/phpstan": "^2.0.4" + "phpstan/phpstan": "^2.1.29" }, "require-dev": { "php-parallel-lint/php-parallel-lint": "^1.2", @@ -320,9 +314,9 @@ "description": "Extra strict and opinionated rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-strict-rules/issues", - "source": "https://github.com/phpstan/phpstan-strict-rules/tree/2.0.6" + "source": "https://github.com/phpstan/phpstan-strict-rules/tree/2.0.7" }, - "time": "2025-07-21T12:19:29+00:00" + "time": "2025-09-26T11:19:08+00:00" }, { "name": "tomasvotruba/type-coverage", @@ -389,5 +383,5 @@ "prefer-lowest": false, "platform": {}, "platform-dev": {}, - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.9.0" } diff --git a/tools/.phpstan/vendor/bin/phpstan b/tools/.phpstan/vendor/bin/phpstan index d76c0be76..905409b46 100755 --- a/tools/.phpstan/vendor/bin/phpstan +++ b/tools/.phpstan/vendor/bin/phpstan @@ -24,15 +24,14 @@ if (PHP_VERSION_ID < 80000) { { private $handle; private $position; - private $realpath; public function stream_open($path, $mode, $options, &$opened_path) { // get rid of phpvfscomposer:// prefix for __FILE__ & __DIR__ resolution $opened_path = substr($path, 17); - $this->realpath = realpath($opened_path) ?: $opened_path; - $opened_path = $this->realpath; - $this->handle = fopen($this->realpath, $mode); + $realpath = realpath($opened_path) ?: $opened_path; + $opened_path = $realpath; + $this->handle = fopen($realpath, $mode); $this->position = 0; return (bool) $this->handle; diff --git a/tools/.phpstan/vendor/bin/phpstan.phar b/tools/.phpstan/vendor/bin/phpstan.phar index fecf96f69..bcb169015 100755 --- a/tools/.phpstan/vendor/bin/phpstan.phar +++ b/tools/.phpstan/vendor/bin/phpstan.phar @@ -24,15 +24,14 @@ if (PHP_VERSION_ID < 80000) { { private $handle; private $position; - private $realpath; public function stream_open($path, $mode, $options, &$opened_path) { // get rid of phpvfscomposer:// prefix for __FILE__ & __DIR__ resolution $opened_path = substr($path, 17); - $this->realpath = realpath($opened_path) ?: $opened_path; - $opened_path = $this->realpath; - $this->handle = fopen($this->realpath, $mode); + $realpath = realpath($opened_path) ?: $opened_path; + $opened_path = $realpath; + $this->handle = fopen($realpath, $mode); $this->position = 0; return (bool) $this->handle; diff --git a/tools/.phpstan/vendor/composer/autoload_static.php b/tools/.phpstan/vendor/composer/autoload_static.php index 7af16ed81..b66b4992e 100644 --- a/tools/.phpstan/vendor/composer/autoload_static.php +++ b/tools/.phpstan/vendor/composer/autoload_static.php @@ -11,43 +11,43 @@ class ComposerStaticInitf9e7218f71d5874b5632927df4f72bd7 ); public static $prefixLengthsPsr4 = array ( - 'T' => + 'T' => array ( 'TomasVotruba\\TypeCoverage\\' => 26, ), - 'P' => + 'P' => array ( 'PHPStan\\ExtensionInstaller\\' => 27, 'PHPStan\\' => 8, ), - 'N' => + 'N' => array ( 'Nette\\' => 6, ), - 'E' => + 'E' => array ( 'Ergebnis\\PHPStan\\Rules\\' => 23, ), ); public static $prefixDirsPsr4 = array ( - 'TomasVotruba\\TypeCoverage\\' => + 'TomasVotruba\\TypeCoverage\\' => array ( 0 => __DIR__ . '/..' . '/tomasvotruba/type-coverage/src', ), - 'PHPStan\\ExtensionInstaller\\' => + 'PHPStan\\ExtensionInstaller\\' => array ( 0 => __DIR__ . '/..' . '/phpstan/extension-installer/src', ), - 'PHPStan\\' => + 'PHPStan\\' => array ( 0 => __DIR__ . '/..' . '/phpstan/phpstan-strict-rules/src', ), - 'Nette\\' => + 'Nette\\' => array ( 0 => __DIR__ . '/..' . '/nette/utils/src', ), - 'Ergebnis\\PHPStan\\Rules\\' => + 'Ergebnis\\PHPStan\\Rules\\' => array ( 0 => __DIR__ . '/..' . '/ergebnis/phpstan-rules/src', ), diff --git a/tools/.phpstan/vendor/composer/installed.json b/tools/.phpstan/vendor/composer/installed.json index 09fde69c1..e83cc4c5d 100644 --- a/tools/.phpstan/vendor/composer/installed.json +++ b/tools/.phpstan/vendor/composer/installed.json @@ -2,17 +2,17 @@ "packages": [ { "name": "ergebnis/phpstan-rules", - "version": "2.11.0", - "version_normalized": "2.11.0.0", + "version": "2.12.0", + "version_normalized": "2.12.0.0", "source": { "type": "git", "url": "https://github.com/ergebnis/phpstan-rules.git", - "reference": "505fead92d89daeb6aa045e92a3e77b55f4ca6a5" + "reference": "c4e0121a937b3b551f800a86e7d78794da2783ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/phpstan-rules/zipball/505fead92d89daeb6aa045e92a3e77b55f4ca6a5", - "reference": "505fead92d89daeb6aa045e92a3e77b55f4ca6a5", + "url": "https://api.github.com/repos/ergebnis/phpstan-rules/zipball/c4e0121a937b3b551f800a86e7d78794da2783ea", + "reference": "c4e0121a937b3b551f800a86e7d78794da2783ea", "shasum": "" }, "require": { @@ -25,10 +25,9 @@ "doctrine/orm": "^2.20.0 || ^3.3.0", "ergebnis/composer-normalize": "^2.47.0", "ergebnis/license": "^2.6.0", - "ergebnis/php-cs-fixer-config": "^6.52.0", - "ergebnis/phpunit-slow-test-detector": "^2.19.1", + "ergebnis/php-cs-fixer-config": "^6.54.0", + "ergebnis/phpunit-slow-test-detector": "^2.20.0", "fakerphp/faker": "^1.24.1", - "nette/di": "^3.1.10", "phpstan/extension-installer": "^1.4.3", "phpstan/phpstan-deprecation-rules": "^2.0.3", "phpstan/phpstan-phpunit": "^2.0.7", @@ -38,7 +37,7 @@ "symfony/finder": "^5.4.45", "symfony/process": "^5.4.47" }, - "time": "2025-08-19T07:58:25+00:00", + "time": "2025-09-07T13:31:33+00:00", "type": "phpstan-extension", "extra": { "phpstan": { @@ -222,17 +221,12 @@ }, { "name": "phpstan/phpstan", - "version": "2.1.22", - "version_normalized": "2.1.22.0", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpstan.git", - "reference": "41600c8379eb5aee63e9413fe9e97273e25d57e4" - }, + "version": "2.1.31", + "version_normalized": "2.1.31.0", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/41600c8379eb5aee63e9413fe9e97273e25d57e4", - "reference": "41600c8379eb5aee63e9413fe9e97273e25d57e4", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/ead89849d879fe203ce9292c6ef5e7e76f867b96", + "reference": "ead89849d879fe203ce9292c6ef5e7e76f867b96", "shasum": "" }, "require": { @@ -241,7 +235,7 @@ "conflict": { "phpstan/phpstan-shim": "*" }, - "time": "2025-08-04T19:17:37+00:00", + "time": "2025-10-10T14:14:11+00:00", "bin": [ "phpstan", "phpstan.phar" @@ -283,22 +277,22 @@ }, { "name": "phpstan/phpstan-strict-rules", - "version": "2.0.6", - "version_normalized": "2.0.6.0", + "version": "2.0.7", + "version_normalized": "2.0.7.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-strict-rules.git", - "reference": "f9f77efa9de31992a832ff77ea52eb42d675b094" + "reference": "d6211c46213d4181054b3d77b10a5c5cb0d59538" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/f9f77efa9de31992a832ff77ea52eb42d675b094", - "reference": "f9f77efa9de31992a832ff77ea52eb42d675b094", + "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/d6211c46213d4181054b3d77b10a5c5cb0d59538", + "reference": "d6211c46213d4181054b3d77b10a5c5cb0d59538", "shasum": "" }, "require": { "php": "^7.4 || ^8.0", - "phpstan/phpstan": "^2.0.4" + "phpstan/phpstan": "^2.1.29" }, "require-dev": { "php-parallel-lint/php-parallel-lint": "^1.2", @@ -306,7 +300,7 @@ "phpstan/phpstan-phpunit": "^2.0", "phpunit/phpunit": "^9.6" }, - "time": "2025-07-21T12:19:29+00:00", + "time": "2025-09-26T11:19:08+00:00", "type": "phpstan-extension", "extra": { "phpstan": { @@ -328,7 +322,7 @@ "description": "Extra strict and opinionated rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-strict-rules/issues", - "source": "https://github.com/phpstan/phpstan-strict-rules/tree/2.0.6" + "source": "https://github.com/phpstan/phpstan-strict-rules/tree/2.0.7" }, "install-path": "../phpstan/phpstan-strict-rules" }, diff --git a/tools/.phpstan/vendor/composer/installed.php b/tools/.phpstan/vendor/composer/installed.php index f294cb70c..14a322c94 100644 --- a/tools/.phpstan/vendor/composer/installed.php +++ b/tools/.phpstan/vendor/composer/installed.php @@ -3,7 +3,7 @@ 'name' => '__root__', 'pretty_version' => 'dev-main', 'version' => 'dev-main', - 'reference' => '086553c5b2e0e1e20293d782d788ab768202b621', + 'reference' => 'ba70759fec4d74412f9854a5c613a5af3e4032d3', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -13,16 +13,16 @@ '__root__' => array( 'pretty_version' => 'dev-main', 'version' => 'dev-main', - 'reference' => '086553c5b2e0e1e20293d782d788ab768202b621', + 'reference' => 'ba70759fec4d74412f9854a5c613a5af3e4032d3', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev_requirement' => false, ), 'ergebnis/phpstan-rules' => array( - 'pretty_version' => '2.11.0', - 'version' => '2.11.0.0', - 'reference' => '505fead92d89daeb6aa045e92a3e77b55f4ca6a5', + 'pretty_version' => '2.12.0', + 'version' => '2.12.0.0', + 'reference' => 'c4e0121a937b3b551f800a86e7d78794da2783ea', 'type' => 'phpstan-extension', 'install_path' => __DIR__ . '/../ergebnis/phpstan-rules', 'aliases' => array(), @@ -47,18 +47,18 @@ 'dev_requirement' => true, ), 'phpstan/phpstan' => array( - 'pretty_version' => '2.1.22', - 'version' => '2.1.22.0', - 'reference' => '41600c8379eb5aee63e9413fe9e97273e25d57e4', + 'pretty_version' => '2.1.31', + 'version' => '2.1.31.0', + 'reference' => 'ead89849d879fe203ce9292c6ef5e7e76f867b96', 'type' => 'library', 'install_path' => __DIR__ . '/../phpstan/phpstan', 'aliases' => array(), 'dev_requirement' => true, ), 'phpstan/phpstan-strict-rules' => array( - 'pretty_version' => '2.0.6', - 'version' => '2.0.6.0', - 'reference' => 'f9f77efa9de31992a832ff77ea52eb42d675b094', + 'pretty_version' => '2.0.7', + 'version' => '2.0.7.0', + 'reference' => 'd6211c46213d4181054b3d77b10a5c5cb0d59538', 'type' => 'phpstan-extension', 'install_path' => __DIR__ . '/../phpstan/phpstan-strict-rules', 'aliases' => array(), diff --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/CHANGELOG.md b/tools/.phpstan/vendor/ergebnis/phpstan-rules/CHANGELOG.md index 00eab751e..7729147af 100644 --- a/tools/.phpstan/vendor/ergebnis/phpstan-rules/CHANGELOG.md +++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/CHANGELOG.md @@ -6,7 +6,15 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## Unreleased -For a full diff see [`2.11.0...main`][2.11.0...main]. +For a full diff see [`2.12.0...main`][2.12.0...main]. + +## [`2.12.0`][2.12.0] + +For a full diff see [`2.11.0...2.12.0`][2.11.0...2.12.0]. + +### Added + +- Added support for PHP 8.5 ([#977]), by [@localheinz] ## [`2.11.0`][2.11.0] @@ -579,6 +587,7 @@ For a full diff see [`362c7ea...0.1.0`][362c7ea...0.1.0]. [2.10.4]: https://github.com/ergebnis/phpstan-rules/releases/tag/2.10.4 [2.10.5]: https://github.com/ergebnis/phpstan-rules/releases/tag/2.10.5 [2.11.0]: https://github.com/ergebnis/phpstan-rules/releases/tag/2.11.0 +[2.12.0]: https://github.com/ergebnis/phpstan-rules/releases/tag/2.12.0 [362c7ea...0.1.0]: https://github.com/ergebnis/phpstan-rules/compare/362c7ea...0.1.0 [0.1.0...0.2.0]: https://github.com/ergebnis/phpstan-rules/compare/0.1.0...0.2.0 @@ -628,7 +637,8 @@ For a full diff see [`362c7ea...0.1.0`][362c7ea...0.1.0]. [2.10.3...2.10.4]: https://github.com/ergebnis/phpstan-rules/compare/2.10.3...2.10.4 [2.10.4...2.10.5]: https://github.com/ergebnis/phpstan-rules/compare/2.10.4...2.10.5 [2.10.5...2.11.0]: https://github.com/ergebnis/phpstan-rules/compare/2.10.5...2.11.0 -[2.11.0...main]: https://github.com/ergebnis/phpstan-rules/compare/2.11.0...main +[2.11.0...2.12.0]: https://github.com/ergebnis/phpstan-rules/compare/2.11.0...2.12.0 +[2.12.0...main]: https://github.com/ergebnis/phpstan-rules/compare/2.12.0...main [#1]: https://github.com/ergebnis/phpstan-rules/pull/1 [#4]: https://github.com/ergebnis/phpstan-rules/pull/4 @@ -725,6 +735,7 @@ For a full diff see [`362c7ea...0.1.0`][362c7ea...0.1.0]. [#957]: https://github.com/ergebnis/phpstan-rules/pull/957 [#958]: https://github.com/ergebnis/phpstan-rules/pull/958 [#972]: https://github.com/ergebnis/phpstan-rules/pull/972 +[#977]: https://github.com/ergebnis/phpstan-rules/pull/977 [@cosmastech]: https://github.com/cosmastech [@enumag]: https://github.com/enumag diff --git a/tools/.phpstan/vendor/ergebnis/phpstan-rules/composer.json b/tools/.phpstan/vendor/ergebnis/phpstan-rules/composer.json index 16e88b2fa..5060dde2d 100644 --- a/tools/.phpstan/vendor/ergebnis/phpstan-rules/composer.json +++ b/tools/.phpstan/vendor/ergebnis/phpstan-rules/composer.json @@ -30,10 +30,9 @@ "doctrine/orm": "^2.20.0 || ^3.3.0", "ergebnis/composer-normalize": "^2.47.0", "ergebnis/license": "^2.6.0", - "ergebnis/php-cs-fixer-config": "^6.52.0", - "ergebnis/phpunit-slow-test-detector": "^2.19.1", + "ergebnis/php-cs-fixer-config": "^6.54.0", + "ergebnis/phpunit-slow-test-detector": "^2.20.0", "fakerphp/faker": "^1.24.1", - "nette/di": "^3.1.10", "phpstan/extension-installer": "^1.4.3", "phpstan/phpstan-deprecation-rules": "^2.0.3", "phpstan/phpstan-phpunit": "^2.0.7", diff --git a/tools/.phpstan/vendor/phpstan/extension-installer/src/GeneratedConfig.php b/tools/.phpstan/vendor/phpstan/extension-installer/src/GeneratedConfig.php index 145d6b0bb..9f5fc96d8 100644 --- a/tools/.phpstan/vendor/phpstan/extension-installer/src/GeneratedConfig.php +++ b/tools/.phpstan/vendor/phpstan/extension-installer/src/GeneratedConfig.php @@ -21,7 +21,7 @@ final class GeneratedConfig 0 => 'rules.neon', ), ), - 'version' => '2.11.0', + 'version' => '2.12.0', 'phpstanVersionConstraint' => '>=2.1.8.0-dev, <3.0.0.0-dev', ), 'phpstan/phpstan-strict-rules' => @@ -35,8 +35,8 @@ final class GeneratedConfig 0 => 'rules.neon', ), ), - 'version' => '2.0.6', - 'phpstanVersionConstraint' => '>=2.0.4.0-dev, <3.0.0.0-dev', + 'version' => '2.0.7', + 'phpstanVersionConstraint' => '>=2.1.29.0-dev, <3.0.0.0-dev', ), 'tomasvotruba/type-coverage' => array ( @@ -58,7 +58,7 @@ final class GeneratedConfig ); /** @var string|null */ - public const PHPSTAN_VERSION_CONSTRAINT = '>=2.1.8.0-dev, <3.0.0.0-dev'; + public const PHPSTAN_VERSION_CONSTRAINT = '>=2.1.29.0-dev, <3.0.0.0-dev'; private function __construct() { diff --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/README.md b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/README.md index e56aa34d7..3a60ec8e1 100644 --- a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/README.md +++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/README.md @@ -13,14 +13,12 @@ | `numericOperandsInArithmeticOperators` | Require numeric operand in `+$var`, `-$var`, `$var++`, `$var--`, `++$var` and `--$var`. | | `numericOperandsInArithmeticOperators` | Require numeric operand in `$var++`, `$var--`, `++$var`and `--$var`. | | `strictFunctionCalls` | These functions contain a `$strict` parameter for better type safety, it must be set to `true`:
* `in_array` (3rd parameter)
* `array_search` (3rd parameter)
* `array_keys` (3rd parameter; only if the 2nd parameter `$search_value` is provided)
* `base64_decode` (2nd parameter). | -| `overwriteVariablesWithLoop` | Variables assigned in `while` loop condition and `for` loop initial assignment cannot be used after the loop. | -| `overwriteVariablesWithLoop` | Variables set in foreach that's always looped thanks to non-empty arrays cannot be used after the loop. | +| `overwriteVariablesWithLoop` | * Disallow overwriting variables with `foreach` key and value variables.
* Disallow overwriting variables with `for` loop initial assignment. | | `switchConditionsMatchingType` | Types in `switch` condition and `case` value must match. PHP compares them loosely by default and that can lead to unexpected results. | | `dynamicCallOnStaticMethod` | Check that statically declared methods are called statically. | | `disallowedEmpty` | Disallow `empty()` - it's a very loose comparison (see [manual](https://php.net/empty)), it's recommended to use more strict one. | | `disallowedShortTernary` | Disallow short ternary operator (`?:`) - implies weak comparison, it's recommended to use null coalesce operator (`??`) or ternary operator with strict condition. | | `noVariableVariables` | Disallow variable variables (`$$foo`, `$this->$method()` etc.). | -| `overwriteVariablesWithLoop` | Disallow overwriting variables with foreach key and value variables. | | `checkAlwaysTrueInstanceof`, `checkAlwaysTrueCheckTypeFunctionCall`, `checkAlwaysTrueStrictComparison` | Always true `instanceof`, type-checking `is_*` functions and strict comparisons `===`/`!==`. These checks can be turned off by setting `checkAlwaysTrueInstanceof`, `checkAlwaysTrueCheckTypeFunctionCall` and `checkAlwaysTrueStrictComparison` to false. | | | Correct case for referenced and called function names. | | `matchingInheritedMethodNames` | Correct case for inherited and implemented method names. | diff --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/composer.json b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/composer.json index 2bbc44d69..bc72c5811 100644 --- a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/composer.json +++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/composer.json @@ -7,7 +7,7 @@ ], "require": { "php": "^7.4 || ^8.0", - "phpstan/phpstan": "^2.0.4" + "phpstan/phpstan": "^2.1.29" }, "require-dev": { "php-parallel-lint/php-parallel-lint": "^1.2", diff --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/rules.neon b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/rules.neon index 7a63c4ec3..0def6d878 100644 --- a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/rules.neon +++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/rules.neon @@ -11,6 +11,7 @@ parameters: reportStaticMethodSignatures: true reportMaybesInPropertyPhpDocTypes: true reportWrongPhpDocTypeInVarTag: true + checkStrictPrintfPlaceholderTypes: true strictRules: allRules: true disallowedLooseComparison: %strictRules.allRules% diff --git a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Classes/RequireParentConstructCallRule.php b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Classes/RequireParentConstructCallRule.php index 77595810a..38c5e0339 100644 --- a/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Classes/RequireParentConstructCallRule.php +++ b/tools/.phpstan/vendor/phpstan/phpstan-strict-rules/src/Rules/Classes/RequireParentConstructCallRule.php @@ -104,26 +104,27 @@ private function callsParentConstruct(Node $parserNode): bool */ private function getParentConstructorClass($classReflection) { - while ($classReflection->getParentClass() !== false) { - $constructor = $classReflection->getParentClass()->hasMethod('__construct') ? $classReflection->getParentClass()->getMethod('__construct') : null; - $constructorWithClassName = $classReflection->getParentClass()->hasMethod($classReflection->getParentClass()->getName()) ? $classReflection->getParentClass()->getMethod($classReflection->getParentClass()->getName()) : null; + $parentClass = $classReflection->getParentClass(); + while ($parentClass !== false) { + $constructor = $parentClass->hasMethod('__construct') ? $parentClass->getMethod('__construct') : null; + $constructorWithClassName = $parentClass->hasMethod($parentClass->getName()) ? $parentClass->getMethod($parentClass->getName()) : null; if ( ( $constructor !== null - && $constructor->getDeclaringClass()->getName() === $classReflection->getParentClass()->getName() + && $constructor->getDeclaringClass()->getName() === $parentClass->getName() && !$constructor->isAbstract() && !$constructor->isPrivate() && !$constructor->isDeprecated() ) || ( $constructorWithClassName !== null - && $constructorWithClassName->getDeclaringClass()->getName() === $classReflection->getParentClass()->getName() + && $constructorWithClassName->getDeclaringClass()->getName() === $parentClass->getName() && !$constructorWithClassName->isAbstract() ) ) { - return $classReflection->getParentClass(); + return $parentClass; } - $classReflection = $classReflection->getParentClass(); + $parentClass = $parentClass->getParentClass(); } return false; diff --git a/tools/.phpstan/vendor/phpstan/phpstan/README.md b/tools/.phpstan/vendor/phpstan/phpstan/README.md index f4af4753a..49bed4fd7 100644 --- a/tools/.phpstan/vendor/phpstan/phpstan/README.md +++ b/tools/.phpstan/vendor/phpstan/phpstan/README.md @@ -60,7 +60,7 @@ Want your logo here? [Learn more »](https://phpstan.org/sponsor)
RightCapital     -ContentKing +Shoptet
ZOL     @@ -78,8 +78,6 @@ Want your logo here? [Learn more »](https://phpstan.org/sponsor)     Inviqa
-Shoptet -    diff --git a/tools/.phpstan/vendor/phpstan/phpstan/bootstrap.php b/tools/.phpstan/vendor/phpstan/phpstan/bootstrap.php index a5d341bfd..ac3e269c1 100644 --- a/tools/.phpstan/vendor/phpstan/phpstan/bootstrap.php +++ b/tools/.phpstan/vendor/phpstan/phpstan/bootstrap.php @@ -92,6 +92,16 @@ final public static function loadClass(string $class): void { require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-php81/Php81.php'; require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-php81/bootstrap.php'; } + + if ( + PHP_VERSION_ID < 80300 + && empty ($GLOBALS['__composer_autoload_files']['662a729f963d39afe703c9d9b7ab4a8c']) + && !class_exists(\Symfony\Polyfill\Php83\Php83::class, false) + ) { + $GLOBALS['__composer_autoload_files']['662a729f963d39afe703c9d9b7ab4a8c'] = true; + require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-php83/Php83.php'; + require_once 'phar://' . __DIR__ . '/phpstan.phar/vendor/symfony/polyfill-php83/bootstrap.php'; + } } $filename = str_replace('\\', DIRECTORY_SEPARATOR, $class); diff --git a/tools/.phpstan/vendor/phpstan/phpstan/composer.json b/tools/.phpstan/vendor/phpstan/phpstan/composer.json index dc62c19ce..8b51d4b71 100644 --- a/tools/.phpstan/vendor/phpstan/phpstan/composer.json +++ b/tools/.phpstan/vendor/phpstan/phpstan/composer.json @@ -16,6 +16,11 @@ "autoload": { "files": ["bootstrap.php"] }, + "source": { + "type": "", + "url": "", + "reference": "" + }, "support": { "issues": "https://github.com/phpstan/phpstan/issues", "forum": "https://github.com/phpstan/phpstan/discussions", diff --git a/tools/.phpstan/vendor/phpstan/phpstan/phpstan.phar b/tools/.phpstan/vendor/phpstan/phpstan/phpstan.phar index c542df205..7462c8537 100755 Binary files a/tools/.phpstan/vendor/phpstan/phpstan/phpstan.phar and b/tools/.phpstan/vendor/phpstan/phpstan/phpstan.phar differ diff --git a/tools/.phpstan/vendor/phpstan/phpstan/phpstan.phar.asc b/tools/.phpstan/vendor/phpstan/phpstan/phpstan.phar.asc index fce211b97..4192866f9 100644 --- a/tools/.phpstan/vendor/phpstan/phpstan/phpstan.phar.asc +++ b/tools/.phpstan/vendor/phpstan/phpstan/phpstan.phar.asc @@ -1,16 +1,16 @@ -----BEGIN PGP SIGNATURE----- -iQIzBAABCgAdFiEEynwsejDI6OEnSoR2UcZzBf/C5cAFAmiRBzAACgkQUcZzBf/C -5cBT9A//bFN1PIaNFWyowUaBTRJJ5bZ5ztqIar8C872t6S3mZmjEicE7d9X8gbWg -sAAJO0hL6rH2bMUJDx4xksCGOcctI2WHauVa02JhzRXM3MKNh1UsfapHWA379j+3 -hwly1F/+fPklDS0W3zigWNlz0W7TFc4g8AL1CtAGeBOaFxeFmVPOU54UkfOy5YBT -PuyxprZ473hZFrdbFRAanp95FLatLSZ9TL53M4SysyLewc6dOoO790l4zdMgYu74 -OxPAdgqZEzHCNOB60mKSFs6W3df9pXsoWvd0W8h9WVmre0COjzgaItDfhJRc+ODN -sR/5ibIaPfhydCSj2tEoLWzNVy2EZpKv7rEBZji81qLcGCe+rC9T+RYygzJKoZ5z -iHOXFmFK/GGevbPFVeN8Tiss3A5wkbNnJGSe3twegwa03IAiJkcqZfwCqRlrHTnH -+k0KsuEB8mpfoYNGhda8u0AFWWIH1QU1//1OhXW3/t7mu/pCcavpXRlIcm8vJGfI -++GWH160+xC4oeX35pbsoHq7c7aWtpeVDobjB1C+Kdhjh/HLkranM5jg/CeYt1ol -EVdQ9rqIVEZdDXcziA0hI+ueM9mf995aMjyAzkis7Oy13EC6PZGjabErNjPRX0oN -wU0YFwBv9hXCUDZN+3U9gzfu8WTNjYYMDE8q7EjbdnXj1+9YJGc= -=owzd +iQIzBAABCgAdFiEEynwsejDI6OEnSoR2UcZzBf/C5cAFAmjpFJAACgkQUcZzBf/C +5cBX9w/+Madphjrc81G2k9OtvthicE1g55EdRCLDTuEyzGeKqYTap72EhoQbTUMQ +0D41PmY56TIygKhnboV56cWik30rquU4nQi8e+rasc/ABLAG3/z/ZEJiTt0OLQ86 +xe81K4nUI/jHSZQwngGYnW+ex+C8yGspdVDuXyJHMtRgqCT7LBxZoSG+51Q85bZE ++o2hPut0O1iGli9golrbcUMUzRNcnbm5vV+1tgv3LBqZA0bOZntSTm1qpgVaZ1/V +hgp0HbTj4WAxYY7kd/MUnD73M1CVqv0/h4xtCnyqU3qlLIyxs/HyUp2igA1eV7Ju +W7B1NFEfqinf8LLKV7IUO2n63fkesD/yQcBYA6q9h9NVqBqKnTsH6Pg27e6pbkJD +dUqJbVRjo8T61nmHgItb8CHMBrLmKcPt8T8eTPNOCNAakLEr2bOsuqooM6taSBSI +wtxOrBgDj4P2+wTlCEBjdUWMnAFpvrhBU/IMfgI06GKUvnIZqCAxe8jyhwZVAXUu +Ag7nPZhjTPBGLSqPsfJGJ4CnnMit57Art6g3C1r7upOkbmu4TRf9sV2jlLzVIWVa +xpUwoxGrU77QM6NkcsFbVLn6qXl6zF4WeYeQf0iAPnrJPjOQh3aIpmtonRO/GLwb +yrl04HzXtr/tid+fhNUV67ocUvRX6CzYL4FWPj16qTTN1PVXrNM= +=Q/DA -----END PGP SIGNATURE----- diff --git a/tools/composer b/tools/composer index ee830d113..f58976cb6 100755 Binary files a/tools/composer and b/tools/composer differ diff --git a/tools/php-cs-fixer b/tools/php-cs-fixer index 9c31190b5..997a14782 100755 Binary files a/tools/php-cs-fixer and b/tools/php-cs-fixer differ