Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 85 additions & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ on:
branches:
- master

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
build:
name: PHP ${{ matrix.php }}
Expand All @@ -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:
Expand All @@ -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

Expand All @@ -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
11 changes: 11 additions & 0 deletions .github/workflows/static-analysis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ on:
branches:
- master

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
psalm:
name: Psalm
Expand All @@ -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

Expand Down
82 changes: 82 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -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 <target>"
@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"
14 changes: 12 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
@@ -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": [
Expand Down Expand Up @@ -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",
Expand All @@ -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",
Expand All @@ -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",
Expand Down
10 changes: 5 additions & 5 deletions psalm.xml
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
<?xml version="1.0"?>
<psalm errorLevel="1" resolveFromConfigFile="true">
<psalm
errorLevel="1"
findUnusedCode="false"
resolveFromConfigFile="true"
>
<projectFiles>
<directory name="src"/>
<directory name="tests"/>
<ignoreFiles>
<directory name="vendor"/>
</ignoreFiles>
Expand All @@ -18,7 +21,4 @@
<MixedAssignment errorLevel="suppress"/>
<RiskyTruthyFalsyComparison errorLevel="suppress"/>
</issueHandlers>
<plugins>
<pluginClass class="Psalm\PhpUnitPlugin\Plugin"/>
</plugins>
</psalm>
Loading