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
34 changes: 34 additions & 0 deletions .composer-require-checker.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
{
"symbol-whitelist": [
"null",
"true",
"false",
"static",
"self",
"parent",
"array",
"string",
"int",
"float",
"bool",
"callable",
"iterable",
"void",
"object",
"mixed",
"never",
"PHPStan\\Analyser\\Scope",
"PHPStan\\Node\\InClassMethodNode",
"PHPStan\\Reflection\\Php\\PhpFunctionFromParserNodeReflection",
"PHPStan\\Rules\\Rule",
"PHPStan\\Rules\\RuleErrorBuilder"
],
"php-core-extensions": [
"Core",
"standard",
"json",
"pcre",
"SPL"
],
"scan-files": []
}
21 changes: 21 additions & 0 deletions .github/workflows/actionlint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
name: actionlint

on:
push:
branches:
- main
pull_request:
branches:
- main

jobs:
actionlint:
name: Lint GitHub Actions workflows
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v6

- name: Run actionlint
uses: rhysd/actionlint@v1.7.10
40 changes: 40 additions & 0 deletions .github/workflows/composer-require-checker.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
name: Composer Require Checker

on:
push:
branches:
- main
pull_request:
branches:
- main

jobs:
composer-require-checker:
name: Run Composer Require Checker
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v6

- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.2'
extensions: json, curl
coverage: none
tools: composer:v2, composer-require-checker

- name: Cache Composer dependencies
uses: actions/cache@v5
with:
path: vendor
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
restore-keys: |
${{ runner.os }}-composer-

- name: Install dependencies
run: composer install --prefer-dist --no-progress --no-interaction

- name: Run Composer Require Checker
run: composer-require-checker check --config-file=.composer-require-checker.json
40 changes: 40 additions & 0 deletions .github/workflows/rector.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
name: Rector

on:
push:
branches:
- main
pull_request:
branches:
- main

jobs:
rector:
name: Run Rector (dry-run)
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v6

- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.2'
extensions: json, curl
coverage: none
tools: composer:v2

- name: Cache Composer dependencies
uses: actions/cache@v5
with:
path: vendor
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
restore-keys: |
${{ runner.os }}-composer-

- name: Install dependencies
run: composer install --prefer-dist --no-progress --no-interaction

- name: Run Rector (dry-run)
run: composer rector
71 changes: 71 additions & 0 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
name: Tests

on:
push:
branches:
- main
pull_request:
branches:
- main

jobs:
test:
name: PHP ${{ matrix.php-version }} Tests
runs-on: ubuntu-latest

strategy:
fail-fast: false
matrix:
php-version:
- '8.2'
- '8.3'
- '8.4'

steps:
- name: Checkout code
uses: actions/checkout@v6

- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-version }}
extensions: curl, json, mbstring
coverage: xdebug
tools: composer:v2

- name: Get composer cache directory
id: composer-cache
run: |
{
printf dir=
composer config cache-files-dir
} > "$GITHUB_OUTPUT"

- name: Cache dependencies
uses: actions/cache@v5
with:
path: ${{ steps.composer-cache.outputs.dir }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
restore-keys: ${{ runner.os }}-composer-

- name: Install dependencies
run: composer install --prefer-dist --no-progress --no-interaction

- name: Run tests
if: matrix.php-version != '8.2'
run: composer test

- name: Run tests with coverage
if: matrix.php-version == '8.2'
run: |
echo "::group::Running PHPUnit with Coverage"
vendor/bin/phpunit --coverage-text --coverage-html coverage-report --colors=never
echo "::endgroup::"

- name: Upload coverage report
if: matrix.php-version == '8.2'
uses: actions/upload-artifact@v4
with:
name: coverage-report
path: coverage-report/
retention-days: 14
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
/vendor/
composer.lock
.phpunit.result.cache
.phpunit.cache/
coverage-report/
.php-cs-fixer.cache
15 changes: 15 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ repos:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
args:
- --unsafe
- id: check-added-large-files
- id: check-merge-conflict
- id: check-json
Expand All @@ -29,6 +31,11 @@ repos:
- --autofix
- --indent=2

- repo: https://github.com/rhysd/actionlint
rev: v1.7.10
hooks:
- id: actionlint

- repo: local
hooks:
- id: php-syntax-check
Expand Down Expand Up @@ -75,3 +82,11 @@ repos:
types:
- php
pass_filenames: false

- id: rector
name: Rector Code Modernization
entry: composer run-script rector-fix
language: system
types:
- php
pass_filenames: false
86 changes: 86 additions & 0 deletions Taskfile.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
# https://taskfile.dev
# Task runner for code quality checks
#
# SEPARATION OF CONCERNS:
# Taskfile: Convenience wrappers for common operations
# Composer: Core code quality checks (phpcs, phpstan, rector)
#
# Installation: https://taskfile.dev/installation/
# macOS: brew install go-task
# Linux: sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -d -b ~/.local/bin
#
# Usage:
# task --list # Show all available tasks
# task check # Run all code quality checks
# task fix # Auto-fix code style issues

version: '3'

tasks:
default:
desc: Show available tasks
cmds:
- task --list

# === Code Quality (delegates to Composer scripts) ===

check:
desc: Run all code quality checks (calls pre-commit run -a)
cmds:
- pre-commit run -a

check:phpcs:
desc: Run PHP CodeSniffer (calls composer phpcs)
cmds:
- composer phpcs

check:phpstan:
desc: Run PHPStan (calls composer phpstan)
cmds:
- composer phpstan

check:rector:
desc: Run Rector dry-run (calls composer rector)
cmds:
- composer rector

fix:
desc: Auto-fix code style (calls composer fix)
cmds:
- composer fix

fix:phpcs:
desc: Auto-fix PHP CodeSniffer issues (calls composer phpcbf)
cmds:
- composer phpcbf

fix:rector:
desc: Apply Rector fixes (calls composer rector-fix)
cmds:
- composer rector-fix

# === Testing ===

test:
desc: Run PHPUnit tests
cmds:
- composer test

# === Development Helpers ===

composer:install:
desc: Install composer dependencies
cmds:
- composer install
- echo "Composer dependencies installed"

composer:update:
desc: Update composer dependencies
cmds:
- composer update
- echo "Composer dependencies updated"

lint:
desc: Run PHP syntax check
cmds:
- composer php-lint
20 changes: 18 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,25 @@
],
"require": {
"php": "^8.2",
"nikic/php-parser": "^5.0",
"phpstan/phpstan": "^2.0"
},
"require-dev": {
"ergebnis/composer-normalize": "^2.42",
"phpunit/phpunit": "^11.0",
"rector/rector": "^2.0",
"squizlabs/php_codesniffer": "^4.0"
},
"autoload": {
"psr-4": {
"OpenCoreEMR\\PHPStan\\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"OpenCoreEMR\\PHPStan\\Tests\\": "tests/"
}
},
"config": {
"allow-plugins": {
"ergebnis/composer-normalize": true
Expand All @@ -43,11 +51,19 @@
"scripts": {
"check": [
"@phpcs",
"@phpstan"
"@phpstan",
"@rector"
],
"fix": [
"@phpcbf",
"@rector-fix"
],
"php-lint": "git ls-files -z '*.php' | xargs -0 -n1 php -l",
"phpcbf": "phpcbf",
"phpcs": "phpcs",
"phpstan": "phpstan analyse -c phpstan.neon src"
"phpstan": "phpstan analyse -c phpstan.neon src",
"rector": "rector process --dry-run",
"rector-fix": "rector process",
"test": "phpunit"
}
}
Loading