From 7b60be208cd8e3383c32091b214b4f182d0a76b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B5=D0=B9=20=D0=97=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=BD?= Date: Tue, 14 Jul 2026 21:14:17 +0400 Subject: [PATCH] =?UTF-8?q?feat:=20=D1=81=D0=B0=D0=BC=D0=BE=D0=B4=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D1=82=D0=BE=D1=87=D0=BD=D1=8B=D0=B9=20=D0=B1?= =?UTF-8?q?=D0=B5=D0=B9=D0=B4=D0=B6=20=D0=BF=D0=BE=D0=BA=D1=80=D1=8B=D1=82?= =?UTF-8?q?=D0=B8=D1=8F=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20Pages?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Endpoint-JSON с фактическим покрытием из clover-отчёта публикуется вместе с документацией на GitHub Pages; бейдж в README читает его через shields без внешних сервисов и токенов. Pages-деплой прогоняет тесты с покрытием перед сборкой: бейдж всегда от реального прогона. --- .github/workflows/deploy-pages.yml | 12 +++++- tools/coverage-badge.php | 61 ++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 tools/coverage-badge.php 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);