diff --git a/.github/workflows/deploy-pages.yml b/.github/workflows/deploy-pages.yml index b6910e3..065f50d 100644 --- a/.github/workflows/deploy-pages.yml +++ b/.github/workflows/deploy-pages.yml @@ -6,6 +6,8 @@ on: - main paths: - src/** + - tests/** + - 'tools/coverage-badge.php' - 'phpdoc.xml' - 'bin/generate-docs.sh' - 'tools/docs-check.php' @@ -36,14 +38,22 @@ jobs: with: php-version: '8.3' extensions: dom, mbstring - coverage: none + coverage: xdebug - name: Install dependencies run: composer install --no-interaction --no-progress --prefer-dist --ignore-platform-reqs + - name: Run coverage for badge + env: + XDEBUG_MODE: coverage + run: composer test:coverage + - name: Build API documentation run: composer docs + - name: Coverage badge endpoint + run: php tools/coverage-badge.php var/coverage/clover.xml docs/coverage.json + - name: Setup Pages uses: actions/configure-pages@v5 diff --git a/tools/coverage-badge.php b/tools/coverage-badge.php new file mode 100644 index 0000000..cb40fdd --- /dev/null +++ b/tools/coverage-badge.php @@ -0,0 +1,61 @@ +#!/usr/bin/env php +project->metrics === null) { + fwrite(STDERR, 'Не удалось разобрать clover.xml.' . PHP_EOL); + + exit(1); +} + +$metrics = $xml->project->metrics; +$statements = (int)$metrics['statements']; +$covered = (int)$metrics['coveredstatements']; + +if ($statements === 0) { + fwrite(STDERR, 'В отчёте нет исполняемых строк.' . PHP_EOL); + + exit(1); +} + +$percent = round($covered / $statements * 100, 2); +$color = $percent >= 98.0 ? 'brightgreen' : ($percent >= 90.0 ? 'yellow' : 'red'); + +$badge = [ + 'schemaVersion' => 1, + 'label' => 'coverage', + 'message' => rtrim(rtrim(number_format($percent, 2, '.', ''), '0'), '.') . '%', + 'color' => $color, +]; + +$dir = \dirname($outputPath); + +if (!is_dir($dir) && !mkdir($dir, 0775, true) && !is_dir($dir)) { + fwrite(STDERR, sprintf('Не удалось создать каталог %s%s', $dir, PHP_EOL)); + + exit(1); +} + +file_put_contents($outputPath, json_encode($badge, JSON_THROW_ON_ERROR) . PHP_EOL); +printf("Бейдж покрытия: %s → %s%s", $badge['message'], $outputPath, PHP_EOL); +exit(0);