Skip to content

Commit

Permalink
Introduced NoConfigResolverInConstructorRule PHPStan custom rule
Browse files Browse the repository at this point in the history
  • Loading branch information
konradoboza committed Dec 10, 2024
1 parent 70b5f38 commit e8f93cc
Show file tree
Hide file tree
Showing 6 changed files with 195 additions and 18 deletions.
70 changes: 70 additions & 0 deletions .github/workflows/backend-ci.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
name: Backend build

on:
push:
branches:
- main
- '[0-9]+.[0-9]+'
pull_request: ~

jobs:
cs-fix:
name: Run code style check
runs-on: "ubuntu-22.04"
strategy:
matrix:
php:
- '8.3'
steps:
- uses: actions/checkout@v4

- name: Setup PHP Action
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
coverage: none
extensions: 'pdo_sqlite, gd'
tools: cs2pr

- uses: ramsey/composer-install@v3
with:
dependency-versions: "highest"

- name: Run code style check
run: composer run-script check-cs -- --format=checkstyle | cs2pr

tests:
name: Tests
runs-on: "ubuntu-22.04"
timeout-minutes: 10

strategy:
fail-fast: false
matrix:
php:
- '8.3'

steps:
- uses: actions/checkout@v4

- name: Setup PHP Action
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
coverage: none
extensions: pdo_sqlite, gd
tools: cs2pr

- uses: ramsey/composer-install@v3
with:
dependency-versions: "highest"
composer-options: "--prefer-dist --no-progress --no-suggest"

- name: Setup problem matchers for PHPUnit
run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json"

- name: Run PHPStan analysis
run: composer run-script phpstan

- name: Run test suite
run: composer run-script --timeout=600 test
14 changes: 14 additions & 0 deletions .php-cs-fixer.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

/**
* @copyright Copyright (C) Ibexa AS. All rights reserved.
* @license For full copyright and license information view LICENSE file distributed with this source code.
*/
declare(strict_types=1);

return \Ibexa\CodeStyle\PhpCsFixer\InternalConfigFactory::build()->setFinder(
PhpCsFixer\Finder::create()
->in(__DIR__ . '/rules')
->in(__DIR__ . '/tests')
->files()->name('*.php')
);
66 changes: 48 additions & 18 deletions composer.json
Original file line number Diff line number Diff line change
@@ -1,21 +1,51 @@
{
"name": "ibexa/phpstan",
"license": "proprietary",
"type": "ibexa-bundle",
"keywords": [
"ibexa-dxp"
],
"require": {
"php": "^7.4 || ^8.0"
},
"config": {
"sort-packages": true
},
"extra": {
"phpstan": {
"includes": [
"extension.neon"
]
"name": "ibexa/phpstan",
"license": "proprietary",
"type": "ibexa-bundle",
"keywords": [
"ibexa-dxp"
],
"require": {
"ibexa/code-style": "~2.0.0",
"ibexa/core": "5.0.x-dev",
"ibexa/doctrine-schema": "5.0.x-dev",
"php": "^7.4 || ^8.0",
"phpstan/phpstan": "^1.10",
"phpstan/phpstan-phpunit": "^1.3",
"phpstan/phpstan-strict-rules": "^1.6",
"phpstan/phpstan-symfony": "^1.3"
},
"autoload": {
"psr-4": {
"Ibexa\\PHPStan\\Rules\\": "rules/"
}
},
"autoload-dev": {
"psr-4": {
"Ibexa\\Tests\\PHPStan\\Rules\\": "tests/rules/"
}
},
"scripts": {
"fix-cs": "php-cs-fixer fix --config=.php-cs-fixer.php --show-progress=dots",
"check-cs": "@fix-cs --dry-run",
"test": "phpunit -c phpunit.xml.dist",
"phpstan": "phpstan analyse -c phpstan.neon"
},
"scripts-descriptions": {
"fix-cs": "Automatically fixes code style in all files",
"check-cs": "Run code style checker for all files",
"test": "Run automatic tests",
"phpstan": "Run static code analysis"
},
"config": {
"sort-packages": true,
"allow-plugins": false
},
"extra": {
"phpstan": {
"includes": [
"extension.neon"
]
}
}
}
}
2 changes: 2 additions & 0 deletions extension.neon
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,5 @@ parameters:
- stubs/Money/Money.stub
- stubs/Money/MoneyFormatter.stub
- stubs/Money/MoneyParser.stub
rules:
- Ibexa\PHPStan\Rules\NoConfigResolverInConstructorRule
6 changes: 6 additions & 0 deletions phpstan.neon
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
parameters:
level: 8
paths:
- rules
- tests
checkMissingCallableSignature: true
55 changes: 55 additions & 0 deletions rules/NoConfigResolverInConstructorRule.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
<?php

/**
* @copyright Copyright (C) Ibexa AS. All rights reserved.
* @license For full copyright and license information view LICENSE file distributed with this source code.
*/
declare(strict_types=1);

namespace Ibexa\PHPStan\Rules;

use Ibexa\Contracts\Core\SiteAccess\ConfigResolverInterface;
use PhpParser\Node;
use PHPStan\Analyser\Scope;
use PHPStan\Rules\Rule;
use PHPStan\Rules\RuleErrorBuilder;
use PHPStan\Type\ObjectType;

/**
* @implements \PHPStan\Rules\Rule<\PhpParser\Node\Expr\New_>
*/
final readonly class NoConfigResolverInConstructorRule implements Rule
{
public function getNodeType(): string
{
return Node\Expr\New_::class;
}

/**
* @throws \PHPStan\ShouldNotHappenException
*/
public function processNode(Node $node, Scope $scope): array
{
$class = $node->class;
if (!$class instanceof Node\Name) {
return [];
}

$className = $class->toString();
$configResolverInterfaceType = new ObjectType(ConfigResolverInterface::class);
$configResolverType = new ObjectType($className);
if ($configResolverInterfaceType->isSuperTypeOf($configResolverType)->no()) {
return [];
}

return [
RuleErrorBuilder
::message(
sprintf('Creating new %s is not allowed, inject it in constructor instead.', $className)
)
->identifier('Ibexa.NoConfigResolverInConstructorRule')
->nonIgnorable()
->build(),
];
}
}

0 comments on commit e8f93cc

Please sign in to comment.