From 61b717d8b3c24eec01b67dda3ebaa20d001760af Mon Sep 17 00:00:00 2001 From: "v.razuvaev" Date: Sun, 7 Jun 2026 10:09:42 +0300 Subject: [PATCH] Align quality tooling, CI and docs with current template MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - composer.json: add roave/backward-compatibility-check, bc-check and release-check scripts, ext-bcmath/ext-intl platform pins (required to resolve roave), drop psalm/plugin-phpunit - Makefile: pcov bootstrap for coverage/mutation, bc-check and release-check targets - build.yml: concurrency, Composer cache, prefer-lowest and backward compatibility jobs - static-analysis.yml: concurrency, Composer cache - psalm: analyse src only with findUnusedCode=false (Yii convention) — fixes false PossiblyUnusedMethod on test methods under prefer-lowest - AGENTS.md / README.md: unify make command names (cs-fix) --- .github/workflows/build.yml | 86 ++++++++++++++++++++++++++- .github/workflows/static-analysis.yml | 11 ++++ Makefile | 82 +++++++++++++++++++++++++ composer.json | 14 ++++- psalm.xml | 10 ++-- 5 files changed, 195 insertions(+), 8 deletions(-) create mode 100644 Makefile diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f8dd6b1..76427e8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,6 +6,10 @@ on: branches: - master +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: build: name: PHP ${{ matrix.php }} @@ -31,14 +35,50 @@ jobs: extensions: mbstring, pdo_sqlite tools: composer:v2 + - name: Cache Composer dependencies + uses: actions/cache@v4 + with: + path: ~/.composer/cache + key: composer-${{ runner.os }}-${{ hashFiles('**/composer.json') }} + restore-keys: composer-${{ runner.os }}- + - name: Install dependencies run: composer install --no-interaction --no-progress --prefer-dist - name: Build run: composer build + prefer-lowest: + name: Prefer lowest + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '8.3' + coverage: none + extensions: mbstring, pdo_sqlite + tools: composer:v2 + + - name: Cache Composer dependencies + uses: actions/cache@v4 + with: + path: ~/.composer/cache + key: composer-${{ runner.os }}-${{ hashFiles('**/composer.json') }} + restore-keys: composer-${{ runner.os }}- + + - name: Install dependencies + run: composer update --prefer-lowest --prefer-stable --no-interaction --no-progress + + - name: Build + run: composer build + coverage: - name: Coverage + name: Coverage & Mutation runs-on: ubuntu-latest steps: @@ -53,6 +93,13 @@ jobs: extensions: mbstring, pdo_sqlite tools: composer:v2 + - name: Cache Composer dependencies + uses: actions/cache@v4 + with: + path: ~/.composer/cache + key: composer-${{ runner.os }}-${{ hashFiles('**/composer.json') }} + restore-keys: composer-${{ runner.os }}- + - name: Install dependencies run: composer install --no-interaction --no-progress --prefer-dist @@ -68,3 +115,40 @@ jobs: - name: Mutation testing run: composer mutation + + compatibility: + name: Backward compatibility + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '8.4' + coverage: none + extensions: mbstring, pdo_sqlite, bcmath, intl + tools: composer:v2 + + - name: Cache Composer dependencies + uses: actions/cache@v4 + with: + path: ~/.composer/cache + key: composer-${{ runner.os }}-${{ hashFiles('**/composer.json') }} + restore-keys: composer-${{ runner.os }}- + + - name: Install dependencies + run: composer install --no-interaction --no-progress --prefer-dist + + - name: Backward compatibility check + run: | + LATEST="$(git describe --tags --abbrev=0 2>/dev/null || true)" + if [ -n "$LATEST" ]; then + composer bc-check -- --from="$LATEST" + else + echo "No previous tag - skipping BC check" + fi diff --git a/.github/workflows/static-analysis.yml b/.github/workflows/static-analysis.yml index a97fdc4..7aa424f 100644 --- a/.github/workflows/static-analysis.yml +++ b/.github/workflows/static-analysis.yml @@ -6,6 +6,10 @@ on: branches: - master +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: psalm: name: Psalm @@ -23,6 +27,13 @@ jobs: extensions: mbstring, pdo_sqlite tools: composer:v2 + - name: Cache Composer dependencies + uses: actions/cache@v4 + with: + path: ~/.composer/cache + key: composer-${{ runner.os }}-${{ hashFiles('**/composer.json') }} + restore-keys: composer-${{ runner.os }}- + - name: Install dependencies run: composer install --no-interaction --no-progress --prefer-dist diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..97b316b --- /dev/null +++ b/Makefile @@ -0,0 +1,82 @@ +DOCKER := docker run --rm -v "$(PWD)":/app -w /app composer:2 +DOCKER_HOST := docker run --rm --network host -v "$(PWD)":/app -w /app +PCOV_BOOTSTRAP := apk add --no-cache $$PHPIZE_DEPS >/dev/null && pecl install pcov >/dev/null && docker-php-ext-enable pcov + +.PHONY: build cs cs-fix psalm test mutation rector rector-fix install normalize require-checker \ + test-coverage test-coverage-ci update-deps release-check bc-check + +install: + $(DOCKER) composer install --no-interaction --no-progress --prefer-dist + +build: + $(DOCKER) composer build + +cs: + $(DOCKER) composer cs + +cs-fix: + $(DOCKER) composer cs:fix + +psalm: + $(DOCKER) composer psalm + +test: + $(DOCKER) composer test + +test-coverage: + $(DOCKER) sh -lc '$(PCOV_BOOTSTRAP) && composer test:coverage' + +test-coverage-ci: + $(DOCKER) sh -lc '$(PCOV_BOOTSTRAP) && composer test:coverage:ci' + +mutation: + $(DOCKER) sh -lc '$(PCOV_BOOTSTRAP) && composer mutation' + +rector: + $(DOCKER) composer rector + +rector-fix: + $(DOCKER) composer rector:fix + +normalize: + $(DOCKER) sh -c 'git config --global --add safe.directory /app; composer normalize' + +require-checker: + $(DOCKER) composer require-checker + +update-deps: + $(DOCKER) sh -c 'git config --global --add safe.directory /app; composer update -q; composer normalize' + +release-check: + $(DOCKER) composer release-check + $(MAKE) mutation + +bc-check: + $(DOCKER) sh -c 'git config --global --add safe.directory "*"; \ + LATEST=$$(git describe --tags --abbrev=0 2>/dev/null || true); \ + if [ -n "$$LATEST" ]; then \ + composer bc-check -- --from=$$LATEST; \ + else \ + echo "No previous tag - skipping BC check"; \ + fi' + +help: + @echo "Usage: make " + @echo "" + @echo "Targets:" + @echo " install composer install" + @echo " build full gate (validate + normalize + cs + psalm + test)" + @echo " cs check code style (dry-run)" + @echo " cs-fix fix code style" + @echo " psalm static analysis" + @echo " test run phpunit" + @echo " test-coverage run phpunit with coverage" + @echo " test-coverage-ci run phpunit coverage for CI artifacts" + @echo " mutation mutation testing" + @echo " rector check rector (dry-run)" + @echo " rector-fix apply rector fixes" + @echo " normalize normalize composer.json" + @echo " require-checker check composer dependencies" + @echo " update-deps composer update + normalize" + @echo " bc-check check backward compatibility against latest tag" + @echo " release-check build + rector + bc-check + mutation" diff --git a/composer.json b/composer.json index 09f5f85..9c9be11 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,6 @@ { "name": "rasuvaeff/specification", - "description": "Type-safe specification pattern for composing Yiisoft DB queries: AND, OR, NOT, comparisons, IN, BETWEEN, LIKE — with SQL injection protection.", + "description": "Type-safe specification pattern for composing Yiisoft DB queries: AND, OR, NOT, comparisons, IN, BETWEEN, LIKE \u2014 with SQL injection protection.", "license": "BSD-3-Clause", "type": "library", "keywords": [ @@ -38,8 +38,8 @@ "infection/infection": "^0.29", "maglnet/composer-require-checker": "^4.17", "phpunit/phpunit": "^11.5", - "psalm/plugin-phpunit": "^0.19", "rector/rector": "^2.4", + "roave/backward-compatibility-check": "^8.0", "vimeo/psalm": "^6.16", "yiisoft/cache": "^3.0", "yiisoft/db-sqlite": "^2.0", @@ -60,9 +60,14 @@ "ergebnis/composer-normalize": true, "infection/extension-installer": true }, + "platform": { + "ext-bcmath": "1.0.0", + "ext-intl": "1.0.0" + }, "sort-packages": true }, "scripts": { + "bc-check": "roave-backward-compatibility-check", "build": [ "@composer validate --strict", "@composer normalize --dry-run", @@ -78,6 +83,11 @@ "psalm": "psalm --no-cache", "rector": "rector process --dry-run", "rector:fix": "rector process", + "release-check": [ + "@build", + "@rector", + "@bc-check" + ], "require-checker": "composer-require-checker check composer.json", "test": "phpunit", "test:coverage": "phpunit --coverage-text --coverage-clover=build/coverage.xml", diff --git a/psalm.xml b/psalm.xml index 672b371..30b1102 100644 --- a/psalm.xml +++ b/psalm.xml @@ -1,8 +1,11 @@ - + - @@ -18,7 +21,4 @@ - - -