diff --git a/.docker/php/Dockerfile b/.docker/php/Dockerfile index f98c3ba..33dd796 100644 --- a/.docker/php/Dockerfile +++ b/.docker/php/Dockerfile @@ -1,4 +1,4 @@ -FROM php:8.2-fpm-alpine +FROM php:8.4-fpm-alpine ARG UID ARG GID diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml index c926661..51412f4 100644 --- a/.github/workflows/quality.yml +++ b/.github/workflows/quality.yml @@ -19,7 +19,7 @@ jobs: - name: Install PHP with extensions uses: shivammathur/setup-php@v2 with: - php-version: '8.2' + php-version: '8.4' coverage: none tools: composer:v2 - name: Install Composer dependencies (locked) @@ -36,7 +36,7 @@ jobs: - name: Install PHP with extensions uses: shivammathur/setup-php@v2 with: - php-version: '8.2' + php-version: '8.4' coverage: none tools: composer:v2 - name: Install Composer dependencies (locked) @@ -53,7 +53,7 @@ jobs: - name: Install PHP with extensions uses: shivammathur/setup-php@v2 with: - php-version: '8.2' + php-version: '8.4' coverage: none tools: composer:v2 - name: Install Composer dependencies (locked) @@ -70,7 +70,7 @@ jobs: - name: Install PHP with extensions uses: shivammathur/setup-php@v2 with: - php-version: '8.2' + php-version: '8.4' coverage: none tools: composer:v2 - name: Install Composer dependencies (locked) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2d7e7a4..0e07db0 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -22,11 +22,17 @@ jobs: php-version: - '8.2' - '8.3' + - '8.4' dependencies: [highest] allowed-to-fail: [false] symfony-require: [''] variant: [normal] include: + - php-version: '8.1' + dependencies: highest + allowed-to-fail: false + symfony-require: 6.4.* + variant: symfony/symfony:"6.4.*" - php-version: '8.2' dependencies: highest allowed-to-fail: false @@ -35,8 +41,8 @@ jobs: - php-version: '8.2' dependencies: highest allowed-to-fail: false - symfony-require: 7.1.* - variant: symfony/symfony:"7.1.*" + symfony-require: 7.3.* + variant: symfony/symfony:"7.3.*" - php-version: '8.3' dependencies: highest allowed-to-fail: false @@ -45,8 +51,18 @@ jobs: - php-version: '8.3' dependencies: highest allowed-to-fail: false - symfony-require: 7.1.* - variant: symfony/symfony:"7.1.*" + symfony-require: 7.3.* + variant: symfony/symfony:"7.3.*" + - php-version: '8.4' + dependencies: highest + allowed-to-fail: false + symfony-require: 6.4.* + variant: symfony/symfony:"6.4.*" + - php-version: '8.4' + dependencies: highest + allowed-to-fail: false + symfony-require: 7.3.* + variant: symfony/symfony:"7.3.*" steps: - name: Checkout diff --git a/composer.json b/composer.json index ef5eef4..cb0eff3 100644 --- a/composer.json +++ b/composer.json @@ -47,13 +47,13 @@ "doctrine/orm": "^2.9 || ^3.0", "dragonmantank/cron-expression": "^3.4", "easycorp/easyadmin-bundle": "^4.8", - "symfony/doctrine-messenger": "^6.4|^7.1", - "symfony/dotenv": "^6.4|^7.1", - "symfony/messenger": "^6.4|^7.1", - "symfony/runtime": "^6.4|^7.1", - "symfony/scheduler": "^6.4|^7.1", - "symfony/string": "^6.4|^7.1", - "symfony/uid": "^6.4|^7.1" + "symfony/doctrine-messenger": "^6.4|^7.3", + "symfony/dotenv": "^6.4|^7.3", + "symfony/messenger": "^6.4|^7.3", + "symfony/runtime": "^6.4|^7.3", + "symfony/scheduler": "^6.4|^7.3", + "symfony/string": "^6.4|^7.3", + "symfony/uid": "^6.4|^7.3" }, "require-dev": { "doctrine/doctrine-fixtures-bundle": "^3.4", @@ -65,11 +65,11 @@ "phpunit/phpunit": "<10.0", "rector/rector": "*", "roave/security-advisories": "dev-latest", - "symfony/browser-kit": "^6.4|^7.1", - "symfony/css-selector": "^6.4|^7.1", - "symfony/debug-bundle": "^6.4|^7.1", + "symfony/browser-kit": "^6.4|^7.3", + "symfony/css-selector": "^6.4|^7.3", + "symfony/debug-bundle": "^6.4|^7.3", "symfony/maker-bundle": "^1.31", - "symfony/web-profiler-bundle": "^6.4|^7.1", + "symfony/web-profiler-bundle": "^6.4|^7.3", "vincentlanglet/twig-cs-fixer": "^3.3" }, "conflict": { diff --git a/rector.php b/rector.php index 997c7e5..9f9d327 100644 --- a/rector.php +++ b/rector.php @@ -3,31 +3,25 @@ declare(strict_types=1); use Rector\Config\RectorConfig; -use Rector\Doctrine\Set\DoctrineSetList; use Rector\Set\ValueObject\LevelSetList; use Rector\Symfony\Set\SymfonySetList; use Rector\ValueObject\PhpVersion; return RectorConfig::configure() - ->withPhpVersion(PhpVersion::PHP_82) + ->withPhpVersion(PhpVersion::PHP_84) ->withPaths([ __DIR__.'/src', __DIR__.'/tests', ]) - ->withPhpSets(php82: true) + ->withPhpSets(php81: true) // here we can define, what prepared sets of rules will be applied - ->withPreparedSets( - deadCode: true, - codeQuality: true - ) + ->withComposerBased(doctrine: true) + ->withPreparedSets(deadCode: true, codeQuality: true, doctrineCodeQuality: true, symfonyCodeQuality: true) + ->withAttributesSets(symfony: true, doctrine: true) ->withSets([ - LevelSetList::UP_TO_PHP_82, + LevelSetList::UP_TO_PHP_81, SymfonySetList::SYMFONY_64, - SymfonySetList::SYMFONY_71, SymfonySetList::SYMFONY_CODE_QUALITY, SymfonySetList::SYMFONY_CONSTRUCTOR_INJECTION, - SymfonySetList::ANNOTATIONS_TO_ATTRIBUTES, - DoctrineSetList::DOCTRINE_CODE_QUALITY, - DoctrineSetList::ANNOTATIONS_TO_ATTRIBUTES, ]) ; diff --git a/src/Controller/Admin/LogRecordCrudController.php b/src/Controller/Admin/LogRecordCrudController.php index a1eea61..40ea6cb 100644 --- a/src/Controller/Admin/LogRecordCrudController.php +++ b/src/Controller/Admin/LogRecordCrudController.php @@ -32,6 +32,11 @@ use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\Security\Http\Attribute\IsGranted; +/** + * @phpstan-template TEntity of AbstractCrudController + * + * @phpstan-extends AbstractCrudController + */ #[IsGranted('ROLE_USER')] class LogRecordCrudController extends AbstractCrudController { diff --git a/src/Controller/Admin/ProcessExecutionCrudController.php b/src/Controller/Admin/ProcessExecutionCrudController.php index 15af87e..1fa21b2 100644 --- a/src/Controller/Admin/ProcessExecutionCrudController.php +++ b/src/Controller/Admin/ProcessExecutionCrudController.php @@ -34,6 +34,11 @@ use Symfony\Component\Security\Http\Attribute\IsGranted; use Symfony\Contracts\Translation\TranslatorInterface; +/** + * @phpstan-template TEntity of AbstractCrudController + * + * @phpstan-extends AbstractCrudController + */ #[IsGranted('ROLE_USER')] class ProcessExecutionCrudController extends AbstractCrudController { @@ -117,7 +122,9 @@ public function showLogs(AdminContext $adminContext): RedirectResponse [ 'process' => [ 'comparison' => '=', - 'value' => $this->getContext()?->getEntity()->getInstance()->getId(), + 'value' => $this->getContext()?->getEntity()->getInstance() instanceof ProcessExecution + ? $this->getContext()->getEntity()->getInstance()->getId() + : null, ], ] ) diff --git a/src/Controller/Admin/ProcessScheduleCrudController.php b/src/Controller/Admin/ProcessScheduleCrudController.php index df5b2f2..5501aff 100644 --- a/src/Controller/Admin/ProcessScheduleCrudController.php +++ b/src/Controller/Admin/ProcessScheduleCrudController.php @@ -36,6 +36,11 @@ use Symfony\Component\Process\Process; use Symfony\Component\Scheduler\Trigger\CronExpressionTrigger; +/** + * @phpstan-template TEntity of AbstractCrudController + * + * @phpstan-extends AbstractCrudController + */ class ProcessScheduleCrudController extends AbstractCrudController { public function __construct(private readonly ProcessConfigurationsManager $processConfigurationsManager) diff --git a/src/Controller/Admin/UserCrudController.php b/src/Controller/Admin/UserCrudController.php index d084fdd..02ccdd3 100644 --- a/src/Controller/Admin/UserCrudController.php +++ b/src/Controller/Admin/UserCrudController.php @@ -32,6 +32,11 @@ use Symfony\Component\PasswordHasher\Hasher\Pbkdf2PasswordHasher; use Symfony\Component\Security\Http\Attribute\IsGranted; +/** + * @phpstan-template TEntity of AbstractCrudController + * + * @phpstan-extends AbstractCrudController + */ #[IsGranted('ROLE_USER')] class UserCrudController extends AbstractCrudController { diff --git a/src/Entity/ProcessSchedule.php b/src/Entity/ProcessSchedule.php index 8eea928..2132202 100644 --- a/src/Entity/ProcessSchedule.php +++ b/src/Entity/ProcessSchedule.php @@ -87,7 +87,12 @@ public function setContext(array $context): void $this->context = $context; } - public function getNextExecution(): null + /** + * PHP 8.1 Fatal error: Null can not be used as a standalone type. + * + * @phpstan-ignore missingType.return + */ + public function getNextExecution() { return null; } diff --git a/src/EventSubscriber/ProcessEventSubscriber.php b/src/EventSubscriber/ProcessEventSubscriber.php index ed90faa..66e3f4f 100644 --- a/src/EventSubscriber/ProcessEventSubscriber.php +++ b/src/EventSubscriber/ProcessEventSubscriber.php @@ -22,12 +22,15 @@ use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\Uid\Uuid; -final readonly class ProcessEventSubscriber implements EventSubscriberInterface +/** + * PHP 8.2 : Replace by readonly class. + */ +final class ProcessEventSubscriber implements EventSubscriberInterface { public function __construct( - private ProcessHandler $processHandler, - private DoctrineProcessHandler $doctrineProcessHandler, - private ProcessExecutionManager $processExecutionManager, + private readonly ProcessHandler $processHandler, + private readonly DoctrineProcessHandler $doctrineProcessHandler, + private readonly ProcessExecutionManager $processExecutionManager, ) { } diff --git a/src/Http/Model/HttpProcessExecution.php b/src/Http/Model/HttpProcessExecution.php index 3c78a4a..7ae3e92 100644 --- a/src/Http/Model/HttpProcessExecution.php +++ b/src/Http/Model/HttpProcessExecution.php @@ -20,18 +20,21 @@ use Symfony\Component\Validator\Constraints\Sequentially; use Symfony\Component\Validator\Constraints\Type; -final readonly class HttpProcessExecution +/** + * PHP 8.2 : Replace by readonly class. + */ +final class HttpProcessExecution { /** * @param string|array $context */ public function __construct( #[Sequentially(constraints: [new NotNull(message: 'Process code is required.'), new IsValidProcessCode()])] - public ?string $code = null, - public ?string $input = null, + public readonly ?string $code = null, + public readonly ?string $input = null, #[AtLeastOneOf(constraints: [new Json(), new Type('array')])] - public string|array $context = [], - public bool $queue = true, + public readonly string|array $context = [], + public readonly bool $queue = true, ) { } } diff --git a/src/Http/ValueResolver/HttpProcessExecuteValueResolver.php b/src/Http/ValueResolver/HttpProcessExecuteValueResolver.php index 31ee50a..d1689b2 100644 --- a/src/Http/ValueResolver/HttpProcessExecuteValueResolver.php +++ b/src/Http/ValueResolver/HttpProcessExecuteValueResolver.php @@ -22,10 +22,13 @@ use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata; use Symfony\Component\Serializer\SerializerInterface; +/** + * PHP 8.2 : Replace by readonly class. + */ #[AsTargetedValueResolver('http_process_execution')] -readonly class HttpProcessExecuteValueResolver implements ValueResolverInterface +class HttpProcessExecuteValueResolver implements ValueResolverInterface { - public function __construct(private string $storageDir, private SerializerInterface $serializer) + public function __construct(private readonly string $storageDir, private readonly SerializerInterface $serializer) { } diff --git a/src/Http/ValueResolver/ProcessConfigurationValueResolver.php b/src/Http/ValueResolver/ProcessConfigurationValueResolver.php index bf88b84..ef06496 100644 --- a/src/Http/ValueResolver/ProcessConfigurationValueResolver.php +++ b/src/Http/ValueResolver/ProcessConfigurationValueResolver.php @@ -20,10 +20,13 @@ use Symfony\Component\HttpKernel\Controller\ValueResolverInterface; use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata; +/** + * PHP 8.2 : Replace by readonly class. + */ #[AsTargetedValueResolver('process')] -readonly class ProcessConfigurationValueResolver implements ValueResolverInterface +class ProcessConfigurationValueResolver implements ValueResolverInterface { - public function __construct(private ProcessConfigurationRegistry $registry) + public function __construct(private readonly ProcessConfigurationRegistry $registry) { } diff --git a/src/Manager/ProcessConfigurationsManager.php b/src/Manager/ProcessConfigurationsManager.php index ff8b8de..00ad111 100644 --- a/src/Manager/ProcessConfigurationsManager.php +++ b/src/Manager/ProcessConfigurationsManager.php @@ -20,6 +20,9 @@ use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\Validator\Constraint; +/** + * PHP 8.2 : Replace by readonly class. + */ /** * @phpstan-type UiOptions array{ * 'source': ?string, @@ -32,9 +35,9 @@ * 'default': array{'input': mixed, 'context': array{array{'key': 'int|text', 'value':'int|text'}}} * } */ -final readonly class ProcessConfigurationsManager +final class ProcessConfigurationsManager { - public function __construct(private ProcessConfigurationRegistry $registry) + public function __construct(private readonly ProcessConfigurationRegistry $registry) { } diff --git a/src/Message/CronProcessMessage.php b/src/Message/CronProcessMessage.php index 8e94c09..a8449d7 100644 --- a/src/Message/CronProcessMessage.php +++ b/src/Message/CronProcessMessage.php @@ -15,9 +15,12 @@ use CleverAge\UiProcessBundle\Entity\ProcessSchedule; -final readonly class CronProcessMessage +/** + * PHP 8.2 : Replace by readonly class. + */ +final class CronProcessMessage { - public function __construct(public ProcessSchedule $processSchedule) + public function __construct(public readonly ProcessSchedule $processSchedule) { } } diff --git a/src/Message/CronProcessMessageHandler.php b/src/Message/CronProcessMessageHandler.php index a517ece..285742a 100644 --- a/src/Message/CronProcessMessageHandler.php +++ b/src/Message/CronProcessMessageHandler.php @@ -16,10 +16,13 @@ use Symfony\Component\Messenger\Attribute\AsMessageHandler; use Symfony\Component\Messenger\MessageBusInterface; +/** + * PHP 8.2 : Replace by readonly class. + */ #[AsMessageHandler] -final readonly class CronProcessMessageHandler +final class CronProcessMessageHandler { - public function __construct(private MessageBusInterface $bus) + public function __construct(private readonly MessageBusInterface $bus) { } diff --git a/src/Message/ProcessExecuteHandler.php b/src/Message/ProcessExecuteHandler.php index dec4a05..3443541 100644 --- a/src/Message/ProcessExecuteHandler.php +++ b/src/Message/ProcessExecuteHandler.php @@ -17,10 +17,13 @@ use CleverAge\UiProcessBundle\Monolog\Handler\ProcessHandler; use Symfony\Component\Messenger\Attribute\AsMessageHandler; +/** + * PHP 8.2 : Replace by readonly class. + */ #[AsMessageHandler] -readonly class ProcessExecuteHandler +class ProcessExecuteHandler { - public function __construct(private ProcessManager $manager, private readonly ProcessHandler $processHandler) + public function __construct(private readonly ProcessManager $manager, private readonly ProcessHandler $processHandler) { } diff --git a/src/Message/ProcessExecuteMessage.php b/src/Message/ProcessExecuteMessage.php index 84fddb0..39c45bb 100644 --- a/src/Message/ProcessExecuteMessage.php +++ b/src/Message/ProcessExecuteMessage.php @@ -13,12 +13,15 @@ namespace CleverAge\UiProcessBundle\Message; -readonly class ProcessExecuteMessage +/** + * PHP 8.2 : Replace by readonly class. + */ +class ProcessExecuteMessage { /** * @param mixed[] $context */ - public function __construct(public string $code, public mixed $input, public array $context = []) + public function __construct(public readonly string $code, public readonly mixed $input, public readonly array $context = []) { } } diff --git a/src/Scheduler/CronScheduler.php b/src/Scheduler/CronScheduler.php index b12fd20..48bc202 100644 --- a/src/Scheduler/CronScheduler.php +++ b/src/Scheduler/CronScheduler.php @@ -22,12 +22,15 @@ use Symfony\Component\Scheduler\ScheduleProviderInterface; use Symfony\Component\Validator\Validator\ValidatorInterface; -readonly class CronScheduler implements ScheduleProviderInterface +/** + * PHP 8.2 : Replace by readonly class. + */ +class CronScheduler implements ScheduleProviderInterface { public function __construct( - private ProcessScheduleRepository $repository, - private ValidatorInterface $validator, - private LoggerInterface $logger, + private readonly ProcessScheduleRepository $repository, + private readonly ValidatorInterface $validator, + private readonly LoggerInterface $logger, ) { } diff --git a/src/Twig/Runtime/ProcessExecutionExtensionRuntime.php b/src/Twig/Runtime/ProcessExecutionExtensionRuntime.php index 592f1e4..90e4967 100644 --- a/src/Twig/Runtime/ProcessExecutionExtensionRuntime.php +++ b/src/Twig/Runtime/ProcessExecutionExtensionRuntime.php @@ -18,11 +18,14 @@ use CleverAge\UiProcessBundle\Repository\ProcessExecutionRepository; use Twig\Extension\RuntimeExtensionInterface; -readonly class ProcessExecutionExtensionRuntime implements RuntimeExtensionInterface +/** + * PHP 8.2 : Replace by readonly class. + */ +class ProcessExecutionExtensionRuntime implements RuntimeExtensionInterface { public function __construct( - private ProcessExecutionRepository $processExecutionRepository, - private ProcessConfigurationsManager $processConfigurationsManager, + private readonly ProcessExecutionRepository $processExecutionRepository, + private readonly ProcessConfigurationsManager $processConfigurationsManager, ) { }