diff --git a/.github/workflows/back-end.yml b/.github/workflows/back-end.yml new file mode 100644 index 0000000..ce112c7 --- /dev/null +++ b/.github/workflows/back-end.yml @@ -0,0 +1,179 @@ +# yaml-language-server: $schema=https://json.schemastore.org/github-workflow + +name: "Back-end" + +on: + pull_request: null + push: + branches: + - "master" +# Add [skip ci] to commit message to skip CI. + +permissions: + contents: "read" + +concurrency: + group: "${{ github.workflow }}-${{ github.ref }}" + cancel-in-progress: true + +jobs: + syntax_errors: + name: "1️⃣ Syntax errors" + runs-on: "ubuntu-22.04" + timeout-minutes: 5 + steps: + - + name: "Set up PHP" + uses: "shivammathur/setup-php@v2" + with: + php-version: "8.2" + extensions: "dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, gd, fileinfo, exif" + coverage: "none" + tools: "parallel-lint" + - + name: "Checkout repository" + uses: "actions/checkout@v4" + - + name: "Search for invalid complex curly syntax 🐌" + run: | + ! git grep -e '\${[A-Z_a-z]' -- '*.php' '*.scss' + - + name: "Check source code for syntax errors" + run: "composer exec --no-interaction -- parallel-lint src/ #tests/" + + unit_tests: + name: "2️⃣ Unit and functional tests" + # TODO We have no unit test. + if: false + needs: + - "syntax_errors" + strategy: + fail-fast: false + matrix: + php-version: + - "8.2" + - "8.3" + dependencies: + - "lowest" + - "highest" + runs-on: "ubuntu-22.04" + timeout-minutes: 5 + steps: + - + name: "Set up PHP" + uses: "shivammathur/setup-php@v2" + with: + php-version: "${{ matrix.php-version }}" + extensions: "dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, gd, fileinfo, exif" + - + name: "Setup problem matcher for PHPUnit" + run: | + echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json" + - + name: "Checkout repository" + uses: "actions/checkout@v4" + - + name: "Install dependencies" + uses: "ramsey/composer-install@v2" + with: + dependency-versions: "${{ matrix.dependencies }}" + - + name: "Execute unit tests" + run: "composer exec -- phpunit" + - + name: "Tests have failed: upload logs" + if: "${{ failure() }}" + uses: "actions/upload-artifact@v3" + with: + path: "storage/logs/" + name: "laravel-logs-${{ matrix.php-version }}-${{ matrix.dependencies }}" + - + name: "Send coverage to Coveralls" + env: + COVERALLS_REPO_TOKEN: "${{ secrets.GITHUB_TOKEN }}" + if: "${{ env.COVERALLS_REPO_TOKEN && matrix.php-version == '8.2' && matrix.dependencies == 'locked' }}" + run: | + wget --no-verbose \ + "https://github.com/php-coveralls/php-coveralls/releases/download/v2.5.3/php-coveralls.phar" + php ./php-coveralls.phar --verbose + + static_analysis: + name: "3️⃣ Static Analysis" + needs: + - "syntax_errors" + runs-on: "ubuntu-22.04" + timeout-minutes: 5 + steps: + - + name: "Set up PHP" + uses: "shivammathur/setup-php@v2" + with: + php-version: "8.2" + extensions: "dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, gd, fileinfo, exif" + coverage: "none" + - + name: "Checkout repository" + uses: "actions/checkout@v4" + - + name: "Check JSON files" + run: | + git ls-files --cached -z -- '*.json' \ + | xargs -t --null -L 1 -- \ + php -r 'json_decode(file_get_contents($argv[1]), null, 512, JSON_THROW_ON_ERROR);' + - + name: "Validate Composer configuration" + run: "composer validate --no-interaction --strict" + - + name: "Install dependencies" + uses: "ramsey/composer-install@v2" + with: + dependency-versions: "locked" + - + name: "Check PSR-4 mapping 🐌" + run: "composer dump-autoload --dev --optimize --strict-psr" + - + # https://github.com/phpstan/phpstan/issues/9475 + name: "Search for $this->$this typo 🐌" + run: | + ! git grep --line-number -e '\$this\s*->\s*\$this' -- ':!:*/back-end\.yml' + - + name: "Install orchestra/testbench" + run: "composer require --dev orchestra/testbench" + - + name: "Perform static analysis" + run: "composer exec -- phpstan || true 'Annotate only'" + + coding_standards: + name: "4️⃣ Coding Standards" + needs: + - "syntax_errors" + runs-on: "ubuntu-22.04" + timeout-minutes: 5 + steps: + - + name: "Set up PHP" + uses: "shivammathur/setup-php@v2" + with: + php-version: "8.2" + extensions: "dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, gd, fileinfo, exif" + coverage: "none" + tools: "phpcs,cs2pr" + - + name: "Checkout repository" + uses: "actions/checkout@v4" + - + name: "Install dependencies" + uses: "ramsey/composer-install@v2" + with: + dependency-versions: "locked" + #- + # name: "Detect coding standards violations" + # run: "composer exec -- phpcs -q --report=checkstyle --standard=PSR12 src/ | cs2pr" + - + name: "Detect coding standards violations" + id: "pint" + run: "composer exec -- pint --verbose --test" + - + name: "Annotate Pint results" + if: "${{ failure() && steps.pint.outcome == 'failure' }}" + run: "composer exec -- pint --test --format=checkstyle | cs2pr" diff --git a/composer.json b/composer.json index 873c5ad..7a379c6 100644 --- a/composer.json +++ b/composer.json @@ -25,16 +25,14 @@ "laravel/laravel": "^10.16", "laravel/pint": "^1.6", "mockery/mockery": "^1.4.4", - "nunomaduro/larastan": "^2.1.6", + "larastan/larastan": "^2.9", "phpunit/phpunit": "^10.2.5" }, "minimum-stability": "dev", "prefer-stable": true, "autoload": { "psr-4": { - "Cone\\Bazar\\Stripe\\": "src/", - "Cone\\Bazar\\Stripe\\Database\\Seeders\\": "database/seeders/", - "Cone\\Bazar\\Stripe\\Database\\Factories\\": "database/factories/" + "Cone\\Bazar\\Stripe\\": "src/" } }, "autoload-dev": { diff --git a/phpstan.neon.dist b/phpstan.neon.dist new file mode 100644 index 0000000..3fba383 --- /dev/null +++ b/phpstan.neon.dist @@ -0,0 +1,10 @@ +includes: + - vendor/larastan/larastan/extension.neon +parameters: + databaseMigrationsPath: + - vendor/conedevelopment/bazar/database/migrations/ + - vendor/orchestra/testbench-core/laravel/migrations/ + paths: + - src/ + level: 5 + checkMissingIterableValueType: false