diff --git a/.gitattributes b/.gitattributes index 1c8e1637..56842108 100644 --- a/.gitattributes +++ b/.gitattributes @@ -13,5 +13,3 @@ rector.php export-ignore phpstan.neon.dist export-ignore phpstan-baseline.neon export-ignore phpstan-console-application.php export-ignore -psalm.xml export-ignore -psalm-baseline.xml export-ignore diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index fea1c189..9614241b 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -29,7 +29,7 @@ jobs: - name: Install PHP with extensions uses: shivammathur/setup-php@v2 with: - php-version: '8.4' + php-version: '8.5' coverage: none tools: composer:v2 extensions: mongodb @@ -54,7 +54,7 @@ jobs: - name: Install PHP with extensions uses: shivammathur/setup-php@v2 with: - php-version: '8.4' + php-version: '8.5' coverage: none tools: composer:v2, composer-normalize:2 env: diff --git a/.github/workflows/qa.yaml b/.github/workflows/qa.yaml index ace3b7be..d2c57fd0 100644 --- a/.github/workflows/qa.yaml +++ b/.github/workflows/qa.yaml @@ -29,7 +29,7 @@ jobs: - name: Install PHP with extensions uses: shivammathur/setup-php@v2 with: - php-version: '8.4' + php-version: '8.5' coverage: none tools: composer:v2 extensions: mongodb @@ -42,31 +42,6 @@ jobs: - name: PHPStan run: vendor/bin/phpstan --no-progress --memory-limit=1G analyse --error-format=github - psalm: - name: Psalm - - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Install PHP with extensions - uses: shivammathur/setup-php@v2 - with: - php-version: '8.4' - coverage: none - tools: composer:v2 - extensions: mongodb - - - name: Install Composer dependencies (highest) - uses: ramsey/composer-install@v3 - with: - dependency-versions: highest - - - name: Psalm - run: vendor/bin/psalm --no-progress --show-info=false --stats --output-format=github --threads=$(nproc) --shepherd --php-version=8.4 - rector: name: Rector @@ -79,7 +54,7 @@ jobs: - name: Install PHP with extensions uses: shivammathur/setup-php@v2 with: - php-version: '8.4' + php-version: '8.5' coverage: none tools: composer:v2 extensions: mongodb diff --git a/.github/workflows/symfony-lint.yaml b/.github/workflows/symfony-lint.yaml index d8df070b..ea791faf 100644 --- a/.github/workflows/symfony-lint.yaml +++ b/.github/workflows/symfony-lint.yaml @@ -29,7 +29,7 @@ jobs: - name: Install PHP with extensions uses: shivammathur/setup-php@v2 with: - php-version: '8.4' + php-version: '8.5' coverage: none tools: composer:v2 @@ -53,7 +53,7 @@ jobs: - name: Install PHP with extensions uses: shivammathur/setup-php@v2 with: - php-version: '8.4' + php-version: '8.5' coverage: none tools: composer:v2 @@ -77,7 +77,7 @@ jobs: - name: Install PHP with extensions uses: shivammathur/setup-php@v2 with: - php-version: '8.4' + php-version: '8.5' coverage: none tools: composer:v2 @@ -101,7 +101,7 @@ jobs: - name: Install PHP with extensions uses: shivammathur/setup-php@v2 with: - php-version: '8.4' + php-version: '8.5' coverage: none tools: composer:v2 diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 93ef10f7..7f0ab6ac 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -34,36 +34,42 @@ jobs: - 27017:27017 strategy: + fail-fast: false matrix: php-version: - - '8.1' - '8.2' - '8.3' - '8.4' + - '8.5' dependencies: [highest] allowed-to-fail: [false] symfony-require: [''] variant: [normal] include: - - php-version: '8.1' + - php-version: '8.2' dependencies: lowest allowed-to-fail: false variant: normal - - php-version: '8.4' + - php-version: '8.5' dependencies: highest allowed-to-fail: false symfony-require: 6.4.* variant: symfony/symfony:"6.4.*" - - php-version: '8.4' + - php-version: '8.5' dependencies: highest allowed-to-fail: false - symfony-require: 7.1.* - variant: symfony/symfony:"7.1.*" - - php-version: '8.4' + symfony-require: 7.3.* + variant: symfony/symfony:"7.3.*" + - php-version: '8.5' dependencies: highest allowed-to-fail: false - symfony-require: 7.2.* - variant: symfony/symfony:"7.2.*" + symfony-require: 7.4.* + variant: symfony/symfony:"7.4.*" + - php-version: '8.5' + dependencies: highest + allowed-to-fail: false + symfony-require: 8.0.* + variant: symfony/symfony:"8.0.*" steps: - name: Checkout diff --git a/.gitignore b/.gitignore index 3fc5b4a9..2fa6c0d3 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,5 @@ composer.lock phpunit.xml phpstan.neon /.phpunit.result.cache +tests/App/config/reference.php /docs/_build/ diff --git a/Makefile b/Makefile index 1f772ffc..18b8dc0a 100644 --- a/Makefile +++ b/Makefile @@ -116,10 +116,6 @@ phpstan: vendor/bin/phpstan --memory-limit=1G analyse .PHONY: phpstan -psalm: - vendor/bin/psalm --php-version=8.4 -.PHONY: psalm - rector: vendor/bin/rector .PHONY: rector diff --git a/README.md b/README.md index 9039974f..43481fce 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,6 @@ Symfony SonataClassificationBundle [![Latest Stable Version](https://poser.pugx.org/sonata-project/classification-bundle/v/stable)](https://packagist.org/packages/sonata-project/classification-bundle) [![Latest Unstable Version](https://poser.pugx.org/sonata-project/classification-bundle/v/unstable)](https://packagist.org/packages/sonata-project/classification-bundle) -[![Psalm Type Coverage][shepherd_stable_badge]][shepherd_stable_link] [![License](https://poser.pugx.org/sonata-project/classification-bundle/license)](https://packagist.org/packages/sonata-project/classification-bundle) [![Total Downloads](https://poser.pugx.org/sonata-project/classification-bundle/downloads)](https://packagist.org/packages/sonata-project/classification-bundle) diff --git a/composer.json b/composer.json index 0fceab97..3eca8170 100644 --- a/composer.json +++ b/composer.json @@ -21,23 +21,23 @@ ], "homepage": "https://docs.sonata-project.org/projects/SonataClassificationBundle", "require": { - "php": "^8.1", + "php": "^8.2", "cocur/slugify": "^4.0", "doctrine/collections": "^1.6 || ^2.0", "doctrine/persistence": "^3.0.2 || ^4.0", - "sonata-project/doctrine-extensions": "^1.13 || ^2.0", - "sonata-project/form-extensions": "^1.4 || ^2.0", - "symfony/config": "^6.4 || ^7.1", - "symfony/console": "^6.4 || ^7.1", - "symfony/dependency-injection": "^6.4 || ^7.1", - "symfony/form": "^6.4 || ^7.1", - "symfony/framework-bundle": "^6.4 || ^7.1", - "symfony/http-foundation": "^6.4 || ^7.1", - "symfony/http-kernel": "^6.4 || ^7.1", - "symfony/options-resolver": "^6.4 || ^7.1", - "symfony/routing": "^6.4 || ^7.1", - "symfony/translation": "^6.4 || ^7.1", - "symfony/validator": "^6.4 || ^7.1", + "sonata-project/doctrine-extensions": "^2.0", + "sonata-project/form-extensions": "^2.0", + "symfony/config": "^6.4 || ^7.3", + "symfony/console": "^6.4 || ^7.3", + "symfony/dependency-injection": "^6.4 || ^7.3", + "symfony/form": "^6.4 || ^7.3", + "symfony/framework-bundle": "^6.4 || ^7.3", + "symfony/http-foundation": "^6.4 || ^7.3", + "symfony/http-kernel": "^6.4 || ^7.3", + "symfony/options-resolver": "^6.4 || ^7.3", + "symfony/routing": "^6.4 || ^7.3", + "symfony/translation": "^6.4 || ^7.3", + "symfony/validator": "^6.4 || ^7.3", "twig/twig": "^3.0" }, "require-dev": { @@ -50,34 +50,31 @@ "knplabs/knp-menu-bundle": "^3.0", "masterminds/html5": "^2.7", "matthiasnoback/symfony-config-test": "^6.1", - "matthiasnoback/symfony-dependency-injection-test": "^6.1", + "matthiasnoback/symfony-dependency-injection-test": "^6.2", "phpstan/extension-installer": "^1.0", "phpstan/phpdoc-parser": "^1.0", "phpstan/phpstan": "^1.0 || ^2.0", "phpstan/phpstan-phpunit": "^1.0 || ^2.0", "phpstan/phpstan-strict-rules": "^1.0 || ^2.0", "phpstan/phpstan-symfony": "^1.0 || ^2.0", - "phpunit/phpunit": "^10.5.54 || ^11.5.38 || ^12.3.10", - "psalm/plugin-phpunit": "^0.18 || ^0.19", - "psalm/plugin-symfony": "^5.0", + "phpunit/phpunit": "^11.5.38 || ^12.3.10", "rector/rector": "^1.1 || ^2.0", - "sonata-project/admin-bundle": "^4.35.4", - "sonata-project/block-bundle": "^4.11 || ^5.0", + "sonata-project/admin-bundle": "^4.39", + "sonata-project/block-bundle": "^5.0", "sonata-project/doctrine-orm-admin-bundle": "^4.0", - "symfony/asset": "^6.4 || ^7.1", - "symfony/browser-kit": "^6.4 || ^7.1", - "symfony/filesystem": "^6.4 || ^7.1", - "symfony/security-bundle": "^6.4 || ^7.1", - "symfony/security-csrf": "^6.4 || ^7.1", - "symfony/twig-bundle": "^6.4 || ^7.1", - "symfony/yaml": "^6.4 || ^7.1", - "vimeo/psalm": "^5.0 || ^6.10" + "symfony/asset": "^6.4 || ^7.3", + "symfony/browser-kit": "^6.4 || ^7.3", + "symfony/filesystem": "^6.4 || ^7.3", + "symfony/security-bundle": "^6.4 || ^7.3", + "symfony/security-csrf": "^6.4 || ^7.3", + "symfony/twig-bundle": "^6.4 || ^7.3", + "symfony/yaml": "^6.4 || ^7.3" }, "conflict": { "doctrine/mongodb-odm": "<2.4", "doctrine/orm": "<2.14", "sonata-project/admin-bundle": "<4.14", - "sonata-project/block-bundle": "<4.11", + "sonata-project/block-bundle": "<5.0", "sonata-project/doctrine-orm-admin-bundle": "<4.0" }, "suggest": { diff --git a/psalm.xml b/psalm.xml deleted file mode 100644 index 626e338b..00000000 --- a/psalm.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/rector.php b/rector.php index 085115f2..3f21a4ed 100644 --- a/rector.php +++ b/rector.php @@ -33,7 +33,7 @@ ]); $rectorConfig->sets([ - LevelSetList::UP_TO_PHP_81, + LevelSetList::UP_TO_PHP_82, PHPUnitSetList::PHPUNIT_100, PHPUnitSetList::PHPUNIT_CODE_QUALITY, ]); diff --git a/src/Admin/Filter/CategoryFilter.php b/src/Admin/Filter/CategoryFilter.php index e0e1fd90..c217b9b0 100644 --- a/src/Admin/Filter/CategoryFilter.php +++ b/src/Admin/Filter/CategoryFilter.php @@ -65,8 +65,6 @@ public function getFormOptions(): array } /** - * @psalm-suppress DeprecatedClass - * * NEXT_MAJOR: Remove this method. */ public function getRenderSettings(): array diff --git a/src/Admin/Filter/CollectionFilter.php b/src/Admin/Filter/CollectionFilter.php index ea3786e9..41145bc0 100644 --- a/src/Admin/Filter/CollectionFilter.php +++ b/src/Admin/Filter/CollectionFilter.php @@ -64,8 +64,6 @@ public function getFormOptions(): array } /** - * @psalm-suppress DeprecatedClass - * * NEXT_MAJOR: Remove this method. */ public function getRenderSettings(): array diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index 055c23ae..ac5d6d5d 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -42,11 +42,6 @@ */ final class Configuration implements ConfigurationInterface { - /** - * @psalm-suppress UndefinedInterfaceMethod - * - * @see https://github.com/psalm/psalm-plugin-symfony/issues/174 - */ public function getConfigTreeBuilder(): TreeBuilder { $treeBuilder = new TreeBuilder('sonata_classification'); diff --git a/src/Form/Type/CategorySelectorType.php b/src/Form/Type/CategorySelectorType.php index 2dc472c7..fe9edd32 100644 --- a/src/Form/Type/CategorySelectorType.php +++ b/src/Form/Type/CategorySelectorType.php @@ -25,8 +25,6 @@ /** * @author Thomas Rabaix - * - * @psalm-suppress MissingTemplateParam https://github.com/phpstan/phpstan-symfony/issues/320 */ final class CategorySelectorType extends AbstractType { diff --git a/tests/Admin/AdminTest.php b/tests/Admin/AdminTest.php index 52ab5b97..5d71dc97 100644 --- a/tests/Admin/AdminTest.php +++ b/tests/Admin/AdminTest.php @@ -27,12 +27,12 @@ final class AdminTest extends TestCase protected function setUp(): void { - $this->contextManager = $this->createMock(ContextManagerInterface::class); + $this->contextManager = static::createStub(ContextManagerInterface::class); } public function testAbstractAdminChildren(): void { - $contextAwareAdmin = $this->createMock(ContextAwareAdmin::class); + $contextAwareAdmin = static::createStub(ContextAwareAdmin::class); static::assertInstanceOf(AbstractAdmin::class, $contextAwareAdmin); $contextAdmin = new ContextAdmin(); static::assertInstanceOf(AbstractAdmin::class, $contextAdmin); diff --git a/tests/App/Entity/Category.php b/tests/App/Entity/Category.php index 4e49d603..b04b2cbc 100644 --- a/tests/App/Entity/Category.php +++ b/tests/App/Entity/Category.php @@ -17,9 +17,6 @@ use Doctrine\ORM\Mapping as ORM; use Sonata\ClassificationBundle\Entity\BaseCategory; -/** - * @psalm-suppress ClassMustBeFinal - */ #[ORM\Entity] #[ORM\Table(name: 'classification__category')] class Category extends BaseCategory diff --git a/tests/App/Entity/Collection.php b/tests/App/Entity/Collection.php index 07896372..b159c813 100644 --- a/tests/App/Entity/Collection.php +++ b/tests/App/Entity/Collection.php @@ -17,9 +17,6 @@ use Doctrine\ORM\Mapping as ORM; use Sonata\ClassificationBundle\Entity\BaseCollection; -/** - * @psalm-suppress ClassMustBeFinal - */ #[ORM\Entity] #[ORM\Table(name: 'classification__collection')] class Collection extends BaseCollection diff --git a/tests/App/Entity/Context.php b/tests/App/Entity/Context.php index a800fef9..2b8a4f59 100644 --- a/tests/App/Entity/Context.php +++ b/tests/App/Entity/Context.php @@ -17,9 +17,6 @@ use Doctrine\ORM\Mapping as ORM; use Sonata\ClassificationBundle\Entity\BaseContext; -/** - * @psalm-suppress ClassMustBeFinal - */ #[ORM\Entity] #[ORM\Table(name: 'classification__context')] class Context extends BaseContext diff --git a/tests/App/Entity/Tag.php b/tests/App/Entity/Tag.php index 6c3633a2..9382917a 100644 --- a/tests/App/Entity/Tag.php +++ b/tests/App/Entity/Tag.php @@ -17,9 +17,6 @@ use Doctrine\ORM\Mapping as ORM; use Sonata\ClassificationBundle\Entity\BaseTag; -/** - * @psalm-suppress ClassMustBeFinal - */ #[ORM\Entity] #[ORM\Table(name: 'classification__tag')] class Tag extends BaseTag diff --git a/tests/App/config/config.yaml b/tests/App/config/config.yaml index 9633cd52..1d08e030 100644 --- a/tests/App/config/config.yaml +++ b/tests/App/config/config.yaml @@ -23,7 +23,6 @@ security: access_control: null twig: - exception_controller: null strict_variables: true sonata_classification: diff --git a/tests/App/config/routes.yaml b/tests/App/config/routes.yaml index 78d09d82..643d6ac0 100644 --- a/tests/App/config/routes.yaml +++ b/tests/App/config/routes.yaml @@ -1,5 +1,5 @@ admin_area: - resource: '@SonataAdminBundle/Resources/config/routing/sonata_admin.xml' + resource: '@SonataAdminBundle/Resources/config/routing/sonata_admin.php' prefix: /admin _sonata_admin: diff --git a/tests/Entity/CategoryManagerTest.php b/tests/Entity/CategoryManagerTest.php index 9c4289e2..c28e7cf6 100644 --- a/tests/Entity/CategoryManagerTest.php +++ b/tests/Entity/CategoryManagerTest.php @@ -64,7 +64,7 @@ public function testGetBySlug(): void private function prepareData(): CategoryInterface { $manager = self::getContainer()->get('doctrine.orm.entity_manager'); - \assert($manager instanceof EntityManagerInterface); + static::assertInstanceOf(EntityManagerInterface::class, $manager); $context = new Context(); $context->setId('1'); @@ -106,7 +106,7 @@ private function prepareData(): CategoryInterface private function getCategoryManager(): CategoryManagerInterface { $categoryManager = self::getContainer()->get('sonata.classification.manager.category'); - \assert($categoryManager instanceof CategoryManagerInterface); + static::assertInstanceOf(CategoryManagerInterface::class, $categoryManager); return $categoryManager; } diff --git a/tests/Entity/CollectionManagerTest.php b/tests/Entity/CollectionManagerTest.php index a6183bb2..c150bfd2 100644 --- a/tests/Entity/CollectionManagerTest.php +++ b/tests/Entity/CollectionManagerTest.php @@ -42,7 +42,7 @@ public function testGetByContext(): void private function prepareData(): void { $manager = self::getContainer()->get('doctrine.orm.entity_manager'); - \assert($manager instanceof EntityManagerInterface); + static::assertInstanceOf(EntityManagerInterface::class, $manager); $context = new Context(); $context->setId('1'); @@ -62,7 +62,7 @@ private function prepareData(): void private function getCollectionManager(): CollectionManagerInterface { $collectionManager = self::getContainer()->get('sonata.classification.manager.collection'); - \assert($collectionManager instanceof CollectionManagerInterface); + static::assertInstanceOf(CollectionManagerInterface::class, $collectionManager); return $collectionManager; } diff --git a/tests/Entity/TagManagerTest.php b/tests/Entity/TagManagerTest.php index 782fbb3f..d7e214ad 100644 --- a/tests/Entity/TagManagerTest.php +++ b/tests/Entity/TagManagerTest.php @@ -42,7 +42,7 @@ public function testGetByContext(): void private function prepareData(): void { $manager = self::getContainer()->get('doctrine.orm.entity_manager'); - \assert($manager instanceof EntityManagerInterface); + static::assertInstanceOf(EntityManagerInterface::class, $manager); $context = new Context(); $context->setId('1'); @@ -62,7 +62,7 @@ private function prepareData(): void private function getTagManager(): TagManagerInterface { $tagManager = self::getContainer()->get('sonata.classification.manager.tag'); - \assert($tagManager instanceof TagManagerInterface); + static::assertInstanceOf(TagManagerInterface::class, $tagManager); return $tagManager; } diff --git a/tests/Functional/Admin/CategoryAdminTest.php b/tests/Functional/Admin/CategoryAdminTest.php index db50cdd3..4d1d8873 100644 --- a/tests/Functional/Admin/CategoryAdminTest.php +++ b/tests/Functional/Admin/CategoryAdminTest.php @@ -117,7 +117,7 @@ public function testCreateFirstCategory(): void private function prepareData(): void { $manager = self::getContainer()->get('doctrine.orm.entity_manager'); - \assert($manager instanceof EntityManagerInterface); + static::assertInstanceOf(EntityManagerInterface::class, $manager); $context = new Context(); $context->setId('default'); @@ -136,7 +136,7 @@ private function prepareData(): void private function countCategories(): int { $manager = static::getContainer()->get('doctrine.orm.entity_manager'); - \assert($manager instanceof EntityManagerInterface); + static::assertInstanceOf(EntityManagerInterface::class, $manager); return $manager->getRepository(Category::class)->count([]); } diff --git a/tests/Functional/Admin/CollectionAdminTest.php b/tests/Functional/Admin/CollectionAdminTest.php index 808240eb..46894825 100644 --- a/tests/Functional/Admin/CollectionAdminTest.php +++ b/tests/Functional/Admin/CollectionAdminTest.php @@ -85,7 +85,7 @@ public static function provideFormsUrlsCases(): iterable private function prepareData(): void { $manager = self::getContainer()->get('doctrine.orm.entity_manager'); - \assert($manager instanceof EntityManagerInterface); + static::assertInstanceOf(EntityManagerInterface::class, $manager); $context = new Context(); $context->setId('default'); diff --git a/tests/Functional/Admin/ContextAdminTest.php b/tests/Functional/Admin/ContextAdminTest.php index 7c38d6ef..64c01c9d 100644 --- a/tests/Functional/Admin/ContextAdminTest.php +++ b/tests/Functional/Admin/ContextAdminTest.php @@ -84,7 +84,7 @@ public static function provideFormsUrlsCases(): iterable private function prepareData(): void { $manager = self::getContainer()->get('doctrine.orm.entity_manager'); - \assert($manager instanceof EntityManagerInterface); + static::assertInstanceOf(EntityManagerInterface::class, $manager); $context = new Context(); $context->setId('default'); diff --git a/tests/Functional/Admin/TagAdminTest.php b/tests/Functional/Admin/TagAdminTest.php index 928e4e24..8b0ea36c 100644 --- a/tests/Functional/Admin/TagAdminTest.php +++ b/tests/Functional/Admin/TagAdminTest.php @@ -85,7 +85,7 @@ public static function provideFormsUrlsCases(): iterable private function prepareData(): void { $manager = self::getContainer()->get('doctrine.orm.entity_manager'); - \assert($manager instanceof EntityManagerInterface); + static::assertInstanceOf(EntityManagerInterface::class, $manager); $context = new Context(); $context->setId('default'); diff --git a/tests/bootstrap.php b/tests/bootstrap.php index c9a01342..ee11adb0 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -31,10 +31,5 @@ } if (file_exists($file = __DIR__.'/custom_bootstrap.php')) { - /** - * @psalm-suppress MissingFile,UnusedPsalmSuppress - * - * @see https://github.com/vimeo/psalm/issues/3886 - */ require_once $file; }