From b8c55d5cb7fa18732c30b282806c5246005990a9 Mon Sep 17 00:00:00 2001 From: Andreas Wolf Date: Fri, 8 Mar 2024 15:02:40 +0100 Subject: [PATCH 1/9] task: Add easy-coding-standard --- .build/ecs.php | 16 ++++++++++++++++ extension-installer/composer.json | 6 +++++- extension-installer/ecs.php | 9 +++++++++ fractor-xml/composer.json | 9 +++++++-- fractor-xml/ecs.php | 11 +++++++++++ fractor/composer.json | 6 +++++- fractor/ecs.php | 11 +++++++++++ typo3-fractor/composer.json | 9 +++++++-- typo3-fractor/ecs.php | 11 +++++++++++ 9 files changed, 82 insertions(+), 6 deletions(-) create mode 100644 .build/ecs.php create mode 100644 extension-installer/ecs.php create mode 100644 fractor-xml/ecs.php create mode 100644 fractor/ecs.php create mode 100644 typo3-fractor/ecs.php diff --git a/.build/ecs.php b/.build/ecs.php new file mode 100644 index 00000000..e8e86755 --- /dev/null +++ b/.build/ecs.php @@ -0,0 +1,16 @@ +withRules([ + NoUnusedImportsFixer::class, + ArraySyntaxFixer::class, + ]) + ->withPreparedSets(psr12: true) + ; diff --git a/extension-installer/composer.json b/extension-installer/composer.json index 48697027..80bf1b37 100644 --- a/extension-installer/composer.json +++ b/extension-installer/composer.json @@ -16,7 +16,8 @@ }, "require-dev": { "composer/composer": "^2.7", - "ergebnis/composer-normalize": "^2.42" + "ergebnis/composer-normalize": "^2.42", + "symplify/easy-coding-standard": "^12.1" }, "autoload": { "psr-4": { @@ -31,5 +32,8 @@ }, "extra": { "class": "a9f\\FractorExtensionInstaller\\InstallerPlugin" + }, + "scripts": { + "style:php": "ecs" } } diff --git a/extension-installer/ecs.php b/extension-installer/ecs.php new file mode 100644 index 00000000..3469801a --- /dev/null +++ b/extension-installer/ecs.php @@ -0,0 +1,9 @@ +withPaths([ + __DIR__ . '/src', + ]) + ; diff --git a/fractor-xml/composer.json b/fractor-xml/composer.json index 93578b17..aecf6092 100644 --- a/fractor-xml/composer.json +++ b/fractor-xml/composer.json @@ -20,7 +20,8 @@ "require-dev": { "ergebnis/composer-normalize": "^2.42", "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^10.5" + "phpunit/phpunit": "^10.5", + "symplify/easy-coding-standard": "^12.1" }, "autoload": { "psr-4": { @@ -40,8 +41,12 @@ }, "config": { "allow-plugins": { - "ergebnis/composer-normalize": true + "ergebnis/composer-normalize": true, + "a9f/fractor-extension-installer": true }, "sort-packages": true + }, + "scripts": { + "style:php": "ecs" } } diff --git a/fractor-xml/ecs.php b/fractor-xml/ecs.php new file mode 100644 index 00000000..5ce15d44 --- /dev/null +++ b/fractor-xml/ecs.php @@ -0,0 +1,11 @@ +withPaths([ + __DIR__ . '/config', + __DIR__ . '/src', + __DIR__ . '/tests', + ]) + ; diff --git a/fractor/composer.json b/fractor/composer.json index a3df0d57..a8aa3648 100644 --- a/fractor/composer.json +++ b/fractor/composer.json @@ -21,7 +21,8 @@ "require-dev": { "ergebnis/composer-normalize": "^2.42", "phpstan/phpstan": "1.10", - "phpunit/phpunit": "^10.5" + "phpunit/phpunit": "^10.5", + "symplify/easy-coding-standard": "^12.1" }, "autoload": { "psr-4": { @@ -41,5 +42,8 @@ "ergebnis/composer-normalize": true }, "sort-packages": true + }, + "scripts": { + "style:php": "ecs" } } diff --git a/fractor/ecs.php b/fractor/ecs.php new file mode 100644 index 00000000..5ce15d44 --- /dev/null +++ b/fractor/ecs.php @@ -0,0 +1,11 @@ +withPaths([ + __DIR__ . '/config', + __DIR__ . '/src', + __DIR__ . '/tests', + ]) + ; diff --git a/typo3-fractor/composer.json b/typo3-fractor/composer.json index 9c4c7cd7..776de292 100644 --- a/typo3-fractor/composer.json +++ b/typo3-fractor/composer.json @@ -19,7 +19,8 @@ "require-dev": { "ergebnis/composer-normalize": "^2.42", "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^10.5" + "phpunit/phpunit": "^10.5", + "symplify/easy-coding-standard": "^12.1" }, "autoload": { "psr-4": { @@ -39,8 +40,12 @@ }, "config": { "allow-plugins": { - "ergebnis/composer-normalize": true + "ergebnis/composer-normalize": true, + "a9f/fractor-extension-installer": true }, "sort-packages": true + }, + "scripts": { + "style:php": "ecs" } } diff --git a/typo3-fractor/ecs.php b/typo3-fractor/ecs.php new file mode 100644 index 00000000..5ce15d44 --- /dev/null +++ b/typo3-fractor/ecs.php @@ -0,0 +1,11 @@ +withPaths([ + __DIR__ . '/config', + __DIR__ . '/src', + __DIR__ . '/tests', + ]) + ; From 574dd0f3e32998b94b7c481889909c81f4de3876 Mon Sep 17 00:00:00 2001 From: Andreas Wolf Date: Fri, 8 Mar 2024 15:06:03 +0100 Subject: [PATCH 2/9] cleanup: Fix code style issues --- extension-installer/src/InstallerPlugin.php | 2 +- extension-installer/src/PackagesFileGenerator.php | 5 ++--- fractor-xml/config/application.php | 2 +- fractor-xml/config/fractor.php | 4 ++-- fractor-xml/src/AbstractXmlFractor.php | 2 +- .../src/DependencyInjection/XmlFractorCompilerPass.php | 2 +- fractor-xml/src/DomNodeVisitor.php | 2 +- fractor-xml/src/XmlFileProcessor.php | 2 +- fractor-xml/src/XmlFractor.php | 2 +- fractor-xml/tests/DomDocumentIteratorTest.php | 8 +++----- fractor-xml/tests/Fixtures/CollectingDomNodeVisitor.php | 5 +++-- fractor/config/application.php | 2 +- fractor/src/Command/ProcessCommand.php | 3 --- fractor/src/Configuration/ConfigResolver.php | 2 +- fractor/src/Configuration/FractorConfig.php | 2 +- .../CompilerPass/FileProcessorCompilerPass.php | 3 +-- fractor/src/DependencyInjection/ContainerBuilder.php | 6 +++--- fractor/src/FileSystem/FileFinder.php | 2 +- fractor/src/Fractor/FractorRule.php | 3 +-- fractor/src/FractorApplication.php | 2 +- fractor/tests/Configuration/FractorConfigTest.php | 2 +- typo3-fractor/src/AbstractFlexformFractor.php | 3 +-- .../src/Rules/FlexForm/AddRenderTypeToFlexFormFractor.php | 3 +-- .../Rules/FlexForm/AddRenderTypeToFlexFormFractorTest.php | 5 +++-- 24 files changed, 33 insertions(+), 41 deletions(-) diff --git a/extension-installer/src/InstallerPlugin.php b/extension-installer/src/InstallerPlugin.php index fbec9d2e..eb024073 100644 --- a/extension-installer/src/InstallerPlugin.php +++ b/extension-installer/src/InstallerPlugin.php @@ -52,4 +52,4 @@ public static function getSubscribedEvents(): array ScriptEvents::POST_UPDATE_CMD => 'processEvent', ]; } -} \ No newline at end of file +} diff --git a/extension-installer/src/PackagesFileGenerator.php b/extension-installer/src/PackagesFileGenerator.php index c6d03d25..8388dcab 100644 --- a/extension-installer/src/PackagesFileGenerator.php +++ b/extension-installer/src/PackagesFileGenerator.php @@ -23,8 +23,7 @@ public function __construct( private readonly InstalledRepositoryInterface $repository, private readonly InstallationManager $installationManager, private readonly string $fileToGenerate - ) - { + ) { } public function generate(): void @@ -49,4 +48,4 @@ public function generate(): void sprintf(self::FILE_TEMPLATE, $installedPackagesCode) ); } -} \ No newline at end of file +} diff --git a/fractor-xml/config/application.php b/fractor-xml/config/application.php index 930adbd5..be45e400 100644 --- a/fractor-xml/config/application.php +++ b/fractor-xml/config/application.php @@ -9,4 +9,4 @@ ->autoconfigure(); $services->load('a9f\\FractorXml\\', __DIR__ . '/../src/'); -}; \ No newline at end of file +}; diff --git a/fractor-xml/config/fractor.php b/fractor-xml/config/fractor.php index 2932e177..0c926c79 100644 --- a/fractor-xml/config/fractor.php +++ b/fractor-xml/config/fractor.php @@ -3,6 +3,6 @@ use a9f\Fractor\Configuration\FractorConfig; use a9f\FractorXml\DependencyInjection\XmlFractorCompilerPass; -return static function(FractorConfig $config) { +return static function (FractorConfig $config) { $config->addCompilerPass(new XmlFractorCompilerPass()); -}; \ No newline at end of file +}; diff --git a/fractor-xml/src/AbstractXmlFractor.php b/fractor-xml/src/AbstractXmlFractor.php index dc43ad4c..337687ac 100644 --- a/fractor-xml/src/AbstractXmlFractor.php +++ b/fractor-xml/src/AbstractXmlFractor.php @@ -29,4 +29,4 @@ public function afterTraversal(\DOMNode $rootNode): void { // no-op for now } -} \ No newline at end of file +} diff --git a/fractor-xml/src/DependencyInjection/XmlFractorCompilerPass.php b/fractor-xml/src/DependencyInjection/XmlFractorCompilerPass.php index ae558d4d..2ab8d8ad 100644 --- a/fractor-xml/src/DependencyInjection/XmlFractorCompilerPass.php +++ b/fractor-xml/src/DependencyInjection/XmlFractorCompilerPass.php @@ -31,4 +31,4 @@ public function process(ContainerBuilder $container): void $definition = $container->findDefinition(XmlFileProcessor::class); $definition->setArgument('$rules', $references); } -} \ No newline at end of file +} diff --git a/fractor-xml/src/DomNodeVisitor.php b/fractor-xml/src/DomNodeVisitor.php index 693dc1c8..8c5792d9 100644 --- a/fractor-xml/src/DomNodeVisitor.php +++ b/fractor-xml/src/DomNodeVisitor.php @@ -17,4 +17,4 @@ public function enterNode(\DOMNode $node): \DOMNode|int; public function leaveNode(\DOMNode $node): void; public function afterTraversal(\DOMNode $rootNode): void; -} \ No newline at end of file +} diff --git a/fractor-xml/src/XmlFileProcessor.php b/fractor-xml/src/XmlFileProcessor.php index 36968168..1ecd9f96 100644 --- a/fractor-xml/src/XmlFileProcessor.php +++ b/fractor-xml/src/XmlFileProcessor.php @@ -32,4 +32,4 @@ public function handle(\SplFileInfo $file): void // TODO only update file if changed file_put_contents($file->getPathname(), $doc->saveXML()); } -} \ No newline at end of file +} diff --git a/fractor-xml/src/XmlFractor.php b/fractor-xml/src/XmlFractor.php index dcd97a60..719bb89f 100644 --- a/fractor-xml/src/XmlFractor.php +++ b/fractor-xml/src/XmlFractor.php @@ -7,4 +7,4 @@ interface XmlFractor public function canHandle(\DOMNode $node): bool; public function refactor(\DOMNode $node): \DOMNode|int|null; -} \ No newline at end of file +} diff --git a/fractor-xml/tests/DomDocumentIteratorTest.php b/fractor-xml/tests/DomDocumentIteratorTest.php index 99ba1752..9b35aeb0 100644 --- a/fractor-xml/tests/DomDocumentIteratorTest.php +++ b/fractor-xml/tests/DomDocumentIteratorTest.php @@ -141,7 +141,7 @@ public function traversalEntersAndLeavesGrandChildrenBeforeLeavingChildren(): vo #[Test] public function nodeIsRemovedFromDomIfVisitorReturnsRemoveNode(): void { - $nodeRemovingVisitor = new class extends CollectingDomNodeVisitor { + $nodeRemovingVisitor = new class() extends CollectingDomNodeVisitor { public function enterNode(\DOMNode $node): \DOMNode|int { parent::enterNode($node); @@ -150,7 +150,6 @@ public function enterNode(\DOMNode $node): \DOMNode|int } return $node; } - }; $document = new \DOMDocument(); $document->loadXML(<<loadXML(<< */ public array $calls = []; @@ -28,4 +29,4 @@ public function afterTraversal(\DOMNode $rootNode): void { $this->calls[] = sprintf('afterTraversal:%s', $rootNode->nodeName); } -} \ No newline at end of file +} diff --git a/fractor/config/application.php b/fractor/config/application.php index 6faa90eb..dfa98f88 100644 --- a/fractor/config/application.php +++ b/fractor/config/application.php @@ -23,4 +23,4 @@ $services->set(FractorConfig::class) ->lazy(true); -}; \ No newline at end of file +}; diff --git a/fractor/src/Command/ProcessCommand.php b/fractor/src/Command/ProcessCommand.php index 32a49fc1..7d7714bf 100644 --- a/fractor/src/Command/ProcessCommand.php +++ b/fractor/src/Command/ProcessCommand.php @@ -3,12 +3,9 @@ namespace a9f\Fractor\Command; use a9f\Fractor\Configuration\FractorConfig; -use a9f\Fractor\FileSystem\FileFinder; -use a9f\Fractor\Fractor\FileProcessor; use a9f\Fractor\Fractor\FractorRunner; use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; diff --git a/fractor/src/Configuration/ConfigResolver.php b/fractor/src/Configuration/ConfigResolver.php index dac3f821..ace456ec 100644 --- a/fractor/src/Configuration/ConfigResolver.php +++ b/fractor/src/Configuration/ConfigResolver.php @@ -32,4 +32,4 @@ private static function getOptionValue(ArgvInput $input, array $nameCandidates): return null; } -} \ No newline at end of file +} diff --git a/fractor/src/Configuration/FractorConfig.php b/fractor/src/Configuration/FractorConfig.php index 62ced667..3b34b28f 100644 --- a/fractor/src/Configuration/FractorConfig.php +++ b/fractor/src/Configuration/FractorConfig.php @@ -109,4 +109,4 @@ public function import(string $configFile): void /** @var callable(FractorConfig): void $closure */ $closure($this); } -} \ No newline at end of file +} diff --git a/fractor/src/DependencyInjection/CompilerPass/FileProcessorCompilerPass.php b/fractor/src/DependencyInjection/CompilerPass/FileProcessorCompilerPass.php index f1cb7cd4..564effdf 100644 --- a/fractor/src/DependencyInjection/CompilerPass/FileProcessorCompilerPass.php +++ b/fractor/src/DependencyInjection/CompilerPass/FileProcessorCompilerPass.php @@ -2,7 +2,6 @@ namespace a9f\Fractor\DependencyInjection\CompilerPass; -use a9f\Fractor\Command\ProcessCommand; use a9f\Fractor\Fractor\FractorRunner; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; @@ -22,4 +21,4 @@ public function process(ContainerBuilder $container): void $definition = $container->findDefinition(FractorRunner::class); $definition->setArgument('$processors', $references); } -} \ No newline at end of file +} diff --git a/fractor/src/DependencyInjection/ContainerBuilder.php b/fractor/src/DependencyInjection/ContainerBuilder.php index 6f3bbdc1..11f202f0 100644 --- a/fractor/src/DependencyInjection/ContainerBuilder.php +++ b/fractor/src/DependencyInjection/ContainerBuilder.php @@ -5,7 +5,6 @@ use a9f\Fractor\Configuration\FractorConfig; use a9f\Fractor\DependencyInjection\CompilerPass\CommandsCompilerPass; use a9f\Fractor\DependencyInjection\CompilerPass\FileProcessorCompilerPass; -use a9f\Fractor\Fractor\FileProcessor; use Symfony\Component\Config\FileLocator; use Symfony\Component\DependencyInjection\Container; use Symfony\Component\DependencyInjection\ContainerInterface; @@ -51,7 +50,8 @@ private function registerConfiguredRules(FractorConfig $config) } } - private function registerConfiguredFileProcessors(FractorConfig $config) { + private function registerConfiguredFileProcessors(FractorConfig $config) + { foreach ($config->getFileProcessors() as $processor) { $config->registerForAutoconfiguration($processor) ->addTag('fractor.file_processor'); @@ -74,4 +74,4 @@ private function importExtensionConfigurations(FractorConfig $config): void } } } -} \ No newline at end of file +} diff --git a/fractor/src/FileSystem/FileFinder.php b/fractor/src/FileSystem/FileFinder.php index db426ca9..7499b804 100644 --- a/fractor/src/FileSystem/FileFinder.php +++ b/fractor/src/FileSystem/FileFinder.php @@ -28,4 +28,4 @@ public function findFiles(array $directories, array $fileExtensions): array } return $files; } -} \ No newline at end of file +} diff --git a/fractor/src/Fractor/FractorRule.php b/fractor/src/Fractor/FractorRule.php index 6dbb8fbf..5b93798c 100644 --- a/fractor/src/Fractor/FractorRule.php +++ b/fractor/src/Fractor/FractorRule.php @@ -4,5 +4,4 @@ interface FractorRule { - -} \ No newline at end of file +} diff --git a/fractor/src/FractorApplication.php b/fractor/src/FractorApplication.php index 1cad27c2..fc0d684a 100644 --- a/fractor/src/FractorApplication.php +++ b/fractor/src/FractorApplication.php @@ -12,4 +12,4 @@ public function __construct() { parent::__construct(self::NAME, 'dev'); } -} \ No newline at end of file +} diff --git a/fractor/tests/Configuration/FractorConfigTest.php b/fractor/tests/Configuration/FractorConfigTest.php index e7a81b6b..468ef164 100644 --- a/fractor/tests/Configuration/FractorConfigTest.php +++ b/fractor/tests/Configuration/FractorConfigTest.php @@ -58,4 +58,4 @@ private function placeConfigFileInTemporaryFolderAndImport(FractorConfig $config } } } -} \ No newline at end of file +} diff --git a/typo3-fractor/src/AbstractFlexformFractor.php b/typo3-fractor/src/AbstractFlexformFractor.php index 790a0b6c..c0e9012a 100644 --- a/typo3-fractor/src/AbstractFlexformFractor.php +++ b/typo3-fractor/src/AbstractFlexformFractor.php @@ -3,7 +3,6 @@ namespace a9f\Typo3Fractor; use a9f\FractorXml\AbstractXmlFractor; -use a9f\FractorXml\XmlFractor; abstract class AbstractFlexformFractor extends AbstractXmlFractor { @@ -11,4 +10,4 @@ public function canHandle(\DOMNode $node): bool { return $node->ownerDocument->firstChild->nodeName === 'T3DataStructure'; } -} \ No newline at end of file +} diff --git a/typo3-fractor/src/Rules/FlexForm/AddRenderTypeToFlexFormFractor.php b/typo3-fractor/src/Rules/FlexForm/AddRenderTypeToFlexFormFractor.php index a2527515..cf2ffd4f 100644 --- a/typo3-fractor/src/Rules/FlexForm/AddRenderTypeToFlexFormFractor.php +++ b/typo3-fractor/src/Rules/FlexForm/AddRenderTypeToFlexFormFractor.php @@ -2,7 +2,6 @@ namespace a9f\Typo3Fractor\Rules\FlexForm; -use a9f\FractorXml\AbstractXmlFractor; use a9f\Typo3Fractor\AbstractFlexformFractor; final class AddRenderTypeToFlexFormFractor extends AbstractFlexformFractor @@ -45,4 +44,4 @@ public function refactor(\DOMNode $node): \DOMNode|int|null return $node; } -} \ No newline at end of file +} diff --git a/typo3-fractor/tests/Rules/FlexForm/AddRenderTypeToFlexFormFractorTest.php b/typo3-fractor/tests/Rules/FlexForm/AddRenderTypeToFlexFormFractorTest.php index 04899178..287ca224 100644 --- a/typo3-fractor/tests/Rules/FlexForm/AddRenderTypeToFlexFormFractorTest.php +++ b/typo3-fractor/tests/Rules/FlexForm/AddRenderTypeToFlexFormFractorTest.php @@ -27,7 +27,8 @@ public function test(string $filePath): void { $fixture = file_get_contents($filePath); if (str_contains($fixture, self::FIXTURE_SEPARATOR)) { - [$originalXml, $expectedResultXml] = array_map('trim', + [$originalXml, $expectedResultXml] = array_map( + 'trim', explode(self::FIXTURE_SEPARATOR, $fixture) ); } else { @@ -44,4 +45,4 @@ public function test(string $filePath): void self::assertXmlStringEqualsXmlString($expectedResultXml, $result); } -} \ No newline at end of file +} From c353c9c1acd9a2696d47a03852b7e006445d70d7 Mon Sep 17 00:00:00 2001 From: Andreas Wolf Date: Fri, 8 Mar 2024 15:52:47 +0100 Subject: [PATCH 3/9] ci: Add code style job for CI --- .../workflows/lint_test_pull_requests.yaml | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 .github/workflows/lint_test_pull_requests.yaml diff --git a/.github/workflows/lint_test_pull_requests.yaml b/.github/workflows/lint_test_pull_requests.yaml new file mode 100644 index 00000000..4f5c7245 --- /dev/null +++ b/.github/workflows/lint_test_pull_requests.yaml @@ -0,0 +1,34 @@ +name: "Code style & tests" +on: + pull_request: + # Run this workflow for all PRs against main + branches: + - main + +jobs: + php-check: + runs-on: ubuntu-latest + strategy: + matrix: + composer-command: ['style:php'] + directory: ['extension-installer', 'fractor', 'fractor-xml', 'typo3-fractor'] + defaults: + run: + working-directory: ${{ matrix.directory }} + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.sha }} + + - name: Install composer dependencies + uses: php-actions/composer@v6 + with: + container_workdir: /app/${{ matrix.directory }} + memory_limit: 512M + + - name: 'Run check "${{ matrix.composer-command }}"' + uses: php-actions/composer@v6 + with: + container_workdir: /app/${{ matrix.directory }} + command: ${{ matrix.composer-command }} + memory_limit: 512M From b67c36a956d948f350c9cf837f03a28ac8c773fd Mon Sep 17 00:00:00 2001 From: Andreas Wolf Date: Fri, 8 Mar 2024 18:43:36 +0100 Subject: [PATCH 4/9] ci: Run Composer Normalize in pipeline --- .github/workflows/lint_test_pull_requests.yaml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/lint_test_pull_requests.yaml b/.github/workflows/lint_test_pull_requests.yaml index 4f5c7245..8a60c90f 100644 --- a/.github/workflows/lint_test_pull_requests.yaml +++ b/.github/workflows/lint_test_pull_requests.yaml @@ -10,7 +10,11 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - composer-command: ['style:php'] + composer-command: + - name: PHP Code Style + command: 'style:php' + - name: Composer normalize + command: 'normalize --dry-run' directory: ['extension-installer', 'fractor', 'fractor-xml', 'typo3-fractor'] defaults: run: @@ -26,9 +30,9 @@ jobs: container_workdir: /app/${{ matrix.directory }} memory_limit: 512M - - name: 'Run check "${{ matrix.composer-command }}"' + - name: 'Run check "${{ matrix.composer-command.name }}"' uses: php-actions/composer@v6 with: container_workdir: /app/${{ matrix.directory }} - command: ${{ matrix.composer-command }} + command: ${{ matrix.composer-command.command }} memory_limit: 512M From 5e10f81baf252ad8bf995bf1c76db3688f65e03e Mon Sep 17 00:00:00 2001 From: Andreas Wolf Date: Fri, 8 Mar 2024 18:45:10 +0100 Subject: [PATCH 5/9] bugfix: Fix normalize errors --- fractor-xml/composer.json | 16 ++++++++-------- typo3-fractor/composer.json | 16 ++++++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/fractor-xml/composer.json b/fractor-xml/composer.json index aecf6092..3343c981 100644 --- a/fractor-xml/composer.json +++ b/fractor-xml/composer.json @@ -23,6 +23,12 @@ "phpunit/phpunit": "^10.5", "symplify/easy-coding-standard": "^12.1" }, + "repositories": { + "fractor": { + "type": "path", + "url": "../*" + } + }, "autoload": { "psr-4": { "a9f\\FractorXml\\": "src/" @@ -33,16 +39,10 @@ "a9f\\FractorXml\\Tests\\": "tests/" } }, - "repositories": { - "fractor": { - "type": "path", - "url": "../*" - } - }, "config": { "allow-plugins": { - "ergebnis/composer-normalize": true, - "a9f/fractor-extension-installer": true + "a9f/fractor-extension-installer": true, + "ergebnis/composer-normalize": true }, "sort-packages": true }, diff --git a/typo3-fractor/composer.json b/typo3-fractor/composer.json index 776de292..2957537c 100644 --- a/typo3-fractor/composer.json +++ b/typo3-fractor/composer.json @@ -22,6 +22,12 @@ "phpunit/phpunit": "^10.5", "symplify/easy-coding-standard": "^12.1" }, + "repositories": { + "fractor": { + "type": "path", + "url": "../*" + } + }, "autoload": { "psr-4": { "a9f\\Typo3Fractor\\": "src/" @@ -32,16 +38,10 @@ "a9f\\Typo3Fractor\\Tests\\": "tests/" } }, - "repositories": { - "fractor": { - "type": "path", - "url": "../*" - } - }, "config": { "allow-plugins": { - "ergebnis/composer-normalize": true, - "a9f/fractor-extension-installer": true + "a9f/fractor-extension-installer": true, + "ergebnis/composer-normalize": true }, "sort-packages": true }, From defe4941276cd03924c174d91686fccd5380ecae Mon Sep 17 00:00:00 2001 From: Andreas Wolf Date: Fri, 8 Mar 2024 18:50:29 +0100 Subject: [PATCH 6/9] ci: Set name of jobs --- .github/workflows/lint_test_pull_requests.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/lint_test_pull_requests.yaml b/.github/workflows/lint_test_pull_requests.yaml index 8a60c90f..965d2144 100644 --- a/.github/workflows/lint_test_pull_requests.yaml +++ b/.github/workflows/lint_test_pull_requests.yaml @@ -16,6 +16,7 @@ jobs: - name: Composer normalize command: 'normalize --dry-run' directory: ['extension-installer', 'fractor', 'fractor-xml', 'typo3-fractor'] + name: ${{ matrix.composer-command.name }}/${{ matrix.directory }} defaults: run: working-directory: ${{ matrix.directory }} From 6310bc9b87cad3f8828925430c54cef017594eab Mon Sep 17 00:00:00 2001 From: Andreas Wolf Date: Fri, 8 Mar 2024 18:53:05 +0100 Subject: [PATCH 7/9] task: Add PHPStan --- .github/workflows/lint_test_pull_requests.yaml | 2 ++ extension-installer/composer.json | 2 ++ extension-installer/phpstan.neon | 5 +++++ fractor-xml/composer.json | 1 + fractor-xml/phpstan.neon | 6 ++++++ fractor/composer.json | 3 ++- fractor/phpstan.neon | 6 ++++++ fractor/src/Configuration/FractorConfig.php | 7 +++++-- typo3-fractor/composer.json | 1 + typo3-fractor/phpstan.neon | 6 ++++++ 10 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 extension-installer/phpstan.neon create mode 100644 fractor-xml/phpstan.neon create mode 100644 fractor/phpstan.neon create mode 100644 typo3-fractor/phpstan.neon diff --git a/.github/workflows/lint_test_pull_requests.yaml b/.github/workflows/lint_test_pull_requests.yaml index 965d2144..1ac782da 100644 --- a/.github/workflows/lint_test_pull_requests.yaml +++ b/.github/workflows/lint_test_pull_requests.yaml @@ -15,6 +15,8 @@ jobs: command: 'style:php' - name: Composer normalize command: 'normalize --dry-run' + - name: PHPStan + command: analyze:php directory: ['extension-installer', 'fractor', 'fractor-xml', 'typo3-fractor'] name: ${{ matrix.composer-command.name }}/${{ matrix.directory }} defaults: diff --git a/extension-installer/composer.json b/extension-installer/composer.json index 80bf1b37..54a68444 100644 --- a/extension-installer/composer.json +++ b/extension-installer/composer.json @@ -17,6 +17,7 @@ "require-dev": { "composer/composer": "^2.7", "ergebnis/composer-normalize": "^2.42", + "phpstan/phpstan": "^1.10", "symplify/easy-coding-standard": "^12.1" }, "autoload": { @@ -34,6 +35,7 @@ "class": "a9f\\FractorExtensionInstaller\\InstallerPlugin" }, "scripts": { + "analyze:php": "phpstan analyze", "style:php": "ecs" } } diff --git a/extension-installer/phpstan.neon b/extension-installer/phpstan.neon new file mode 100644 index 00000000..d7ce77ba --- /dev/null +++ b/extension-installer/phpstan.neon @@ -0,0 +1,5 @@ +parameters: + level: 8 + + paths: + - src/ diff --git a/fractor-xml/composer.json b/fractor-xml/composer.json index 3343c981..302a6b6f 100644 --- a/fractor-xml/composer.json +++ b/fractor-xml/composer.json @@ -47,6 +47,7 @@ "sort-packages": true }, "scripts": { + "analyze:php": "phpstan analyze", "style:php": "ecs" } } diff --git a/fractor-xml/phpstan.neon b/fractor-xml/phpstan.neon new file mode 100644 index 00000000..dd7c8e94 --- /dev/null +++ b/fractor-xml/phpstan.neon @@ -0,0 +1,6 @@ +parameters: + level: 8 + + paths: + - src/ + - tests/ diff --git a/fractor/composer.json b/fractor/composer.json index a8aa3648..6870e80f 100644 --- a/fractor/composer.json +++ b/fractor/composer.json @@ -20,7 +20,7 @@ }, "require-dev": { "ergebnis/composer-normalize": "^2.42", - "phpstan/phpstan": "1.10", + "phpstan/phpstan": "^1.10", "phpunit/phpunit": "^10.5", "symplify/easy-coding-standard": "^12.1" }, @@ -44,6 +44,7 @@ "sort-packages": true }, "scripts": { + "analyze:php": "phpstan analyze", "style:php": "ecs" } } diff --git a/fractor/phpstan.neon b/fractor/phpstan.neon new file mode 100644 index 00000000..dd7c8e94 --- /dev/null +++ b/fractor/phpstan.neon @@ -0,0 +1,6 @@ +parameters: + level: 8 + + paths: + - src/ + - tests/ diff --git a/fractor/src/Configuration/FractorConfig.php b/fractor/src/Configuration/FractorConfig.php index 3b34b28f..0d395cae 100644 --- a/fractor/src/Configuration/FractorConfig.php +++ b/fractor/src/Configuration/FractorConfig.php @@ -8,7 +8,7 @@ final class FractorConfig extends ContainerBuilder { - /** @var non-empty-list */ + /** @var list */ private array $paths = []; /** @@ -34,7 +34,7 @@ public function setPaths(array $paths): self } /** - * @return non-empty-list + * @return list */ public function getPaths(): array { @@ -58,6 +58,9 @@ public function getFileProcessors(): array return $this->processors; } + /** + * @param list $extensions + */ public function setFileExtensions(array $extensions): self { $this->fileExtensions = $extensions; diff --git a/typo3-fractor/composer.json b/typo3-fractor/composer.json index 2957537c..6126286f 100644 --- a/typo3-fractor/composer.json +++ b/typo3-fractor/composer.json @@ -46,6 +46,7 @@ "sort-packages": true }, "scripts": { + "analyze:php": "phpstan analyze", "style:php": "ecs" } } diff --git a/typo3-fractor/phpstan.neon b/typo3-fractor/phpstan.neon new file mode 100644 index 00000000..dd7c8e94 --- /dev/null +++ b/typo3-fractor/phpstan.neon @@ -0,0 +1,6 @@ +parameters: + level: 8 + + paths: + - src/ + - tests/ From 9506621e46773629a55add6d09ee07bb6885ad0c Mon Sep 17 00:00:00 2001 From: Andreas Wolf Date: Fri, 8 Mar 2024 19:15:35 +0100 Subject: [PATCH 8/9] task: Fix PHPStan errors --- fractor-xml/src/DomDocumentIterator.php | 9 ++++++++- fractor-xml/src/XmlFractor.php | 5 ++++- fractor-xml/tests/DomDocumentIteratorTest.php | 15 +++++++++++---- .../src/DependencyInjection/ContainerBuilder.php | 6 +++--- fractor/src/FileSystem/FileFinder.php | 2 ++ fractor/tests/Configuration/FractorConfigTest.php | 1 + typo3-fractor/composer.json | 3 ++- typo3-fractor/src/AbstractFlexformFractor.php | 9 ++++++++- .../FlexForm/AddRenderTypeToFlexFormFractor.php | 9 ++++++++- .../AddRenderTypeToFlexFormFractorTest.php | 6 ++++-- 10 files changed, 51 insertions(+), 14 deletions(-) diff --git a/fractor-xml/src/DomDocumentIterator.php b/fractor-xml/src/DomDocumentIterator.php index dd5e48e8..9a91980a 100644 --- a/fractor-xml/src/DomDocumentIterator.php +++ b/fractor-xml/src/DomDocumentIterator.php @@ -20,7 +20,9 @@ public function traverseDocument(\DOMDocument $document): void $visitor->beforeTraversal($document); } - $this->traverseNode($document->firstChild); + if ($document->firstChild instanceof \DOMNode) { + $this->traverseNode($document->firstChild); + } foreach ($this->visitors as $visitor) { $visitor->afterTraversal($document); @@ -33,6 +35,11 @@ private function traverseNode(\DOMNode $node): void foreach ($this->visitors as $visitor) { $result = $visitor->enterNode($node); + if ($node->parentNode === null) { + // TODO convert into a custom ShouldNotHappenException + throw new \RuntimeException('Node has no parent node'); + } + if ($result === DomDocumentIterator::REMOVE_NODE) { $node->parentNode->removeChild($node); $nodeRemoved = true; diff --git a/fractor-xml/src/XmlFractor.php b/fractor-xml/src/XmlFractor.php index 719bb89f..13f34730 100644 --- a/fractor-xml/src/XmlFractor.php +++ b/fractor-xml/src/XmlFractor.php @@ -2,9 +2,12 @@ namespace a9f\FractorXml; -interface XmlFractor +interface XmlFractor extends DomNodeVisitor { public function canHandle(\DOMNode $node): bool; + /** + * @return \DOMNode|DomDocumentIterator::*|null + */ public function refactor(\DOMNode $node): \DOMNode|int|null; } diff --git a/fractor-xml/tests/DomDocumentIteratorTest.php b/fractor-xml/tests/DomDocumentIteratorTest.php index 9b35aeb0..a552870d 100644 --- a/fractor-xml/tests/DomDocumentIteratorTest.php +++ b/fractor-xml/tests/DomDocumentIteratorTest.php @@ -168,7 +168,7 @@ public function enterNode(\DOMNode $node): \DOMNode|int 'afterTraversal:#document', ], $nodeRemovingVisitor->calls); - self::assertXmlStringEqualsXmlString('', $document->saveXML()); + self::assertXmlStringEqualsXmlString('', $document->saveXML() ?: ''); } #[Test] @@ -179,6 +179,10 @@ public function enterNode(\DOMNode $node): \DOMNode|int { parent::enterNode($node); if ($node->nodeName === 'Child') { + if ($node->ownerDocument === null) { + throw new \RuntimeException('Node does not have an ownerDocument, cannot create element'); + } + return $node->ownerDocument->createElement('NewChild'); } return $node; @@ -201,14 +205,17 @@ public function enterNode(\DOMNode $node): \DOMNode|int 'afterTraversal:#document', ], $nodeRemovingVisitor->calls); - self::assertXmlStringEqualsXmlString('', $document->saveXML()); + self::assertXmlStringEqualsXmlString('', $document->saveXML() ?: ''); } - private function getCollectingDomNodeVisitor(): DomNodeVisitor + private function getCollectingDomNodeVisitor(): CollectingDomNodeVisitor { return new CollectingDomNodeVisitor(); } + /** + * @param list $recorder + */ private function getCallRecordingDomNodeVisitor(string $visitorName, array &$recorder): DomNodeVisitor { return new class($visitorName, $recorder) implements DomNodeVisitor { @@ -217,7 +224,7 @@ private function getCallRecordingDomNodeVisitor(string $visitorName, array &$rec */ public function __construct( private readonly string $visitorName, - private array &$calls + public array &$calls // only public to please PHPStan ) { } diff --git a/fractor/src/DependencyInjection/ContainerBuilder.php b/fractor/src/DependencyInjection/ContainerBuilder.php index 11f202f0..7b176c7d 100644 --- a/fractor/src/DependencyInjection/ContainerBuilder.php +++ b/fractor/src/DependencyInjection/ContainerBuilder.php @@ -30,7 +30,7 @@ public function createDependencyInjectionContainer(?string $fractorConfigFile): $config->addCompilerPass(new CommandsCompilerPass()); $config->addCompilerPass(new FileProcessorCompilerPass()); - if (is_file($fractorConfigFile)) { + if ($fractorConfigFile !== null && is_file($fractorConfigFile)) { $config->import($fractorConfigFile); } @@ -42,7 +42,7 @@ public function createDependencyInjectionContainer(?string $fractorConfigFile): return $config; } - private function registerConfiguredRules(FractorConfig $config) + private function registerConfiguredRules(FractorConfig $config): void { foreach ($config->getRules() as $rule) { $config->registerForAutoconfiguration($rule) @@ -50,7 +50,7 @@ private function registerConfiguredRules(FractorConfig $config) } } - private function registerConfiguredFileProcessors(FractorConfig $config) + private function registerConfiguredFileProcessors(FractorConfig $config): void { foreach ($config->getFileProcessors() as $processor) { $config->registerForAutoconfiguration($processor) diff --git a/fractor/src/FileSystem/FileFinder.php b/fractor/src/FileSystem/FileFinder.php index 7499b804..fa3225ee 100644 --- a/fractor/src/FileSystem/FileFinder.php +++ b/fractor/src/FileSystem/FileFinder.php @@ -7,6 +7,8 @@ final class FileFinder { /** + * @param list $directories + * @param list $fileExtensions * @return list<\SplFileInfo> */ public function findFiles(array $directories, array $fileExtensions): array diff --git a/fractor/tests/Configuration/FractorConfigTest.php b/fractor/tests/Configuration/FractorConfigTest.php index 468ef164..dc28a4f3 100644 --- a/fractor/tests/Configuration/FractorConfigTest.php +++ b/fractor/tests/Configuration/FractorConfigTest.php @@ -48,6 +48,7 @@ public function importFileThrowsExceptionIfNoClosureIsReturned(): void private function placeConfigFileInTemporaryFolderAndImport(FractorConfig $config, string $closure): void { $tempFile = tempnam(sys_get_temp_dir(), 'fractor-test'); + self::assertIsString($tempFile); try { file_put_contents($tempFile, $closure); diff --git a/typo3-fractor/composer.json b/typo3-fractor/composer.json index 6126286f..479d8de9 100644 --- a/typo3-fractor/composer.json +++ b/typo3-fractor/composer.json @@ -14,7 +14,8 @@ "php": "^8.2", "a9f/fractor": "@dev", "a9f/fractor-extension-installer": "@dev", - "a9f/fractor-xml": "@dev" + "a9f/fractor-xml": "@dev", + "thecodingmachine/safe": "^2.5" }, "require-dev": { "ergebnis/composer-normalize": "^2.42", diff --git a/typo3-fractor/src/AbstractFlexformFractor.php b/typo3-fractor/src/AbstractFlexformFractor.php index c0e9012a..92520d01 100644 --- a/typo3-fractor/src/AbstractFlexformFractor.php +++ b/typo3-fractor/src/AbstractFlexformFractor.php @@ -8,6 +8,13 @@ abstract class AbstractFlexformFractor extends AbstractXmlFractor { public function canHandle(\DOMNode $node): bool { - return $node->ownerDocument->firstChild->nodeName === 'T3DataStructure'; + $rootNode = $node->ownerDocument?->firstChild; + + if ($rootNode === null) { + // TODO convert into a custom ShouldNotHappenException + throw new \RuntimeException('Node\'s document does not have a root node'); + } + + return $rootNode->nodeName === 'T3DataStructure'; } } diff --git a/typo3-fractor/src/Rules/FlexForm/AddRenderTypeToFlexFormFractor.php b/typo3-fractor/src/Rules/FlexForm/AddRenderTypeToFlexFormFractor.php index cf2ffd4f..67db2305 100644 --- a/typo3-fractor/src/Rules/FlexForm/AddRenderTypeToFlexFormFractor.php +++ b/typo3-fractor/src/Rules/FlexForm/AddRenderTypeToFlexFormFractor.php @@ -37,7 +37,14 @@ public function refactor(\DOMNode $node): \DOMNode|int|null } if ($isSingleSelect) { - $renderType = $childNode->ownerDocument->createElement('renderType'); + $ownerDocument = $node->ownerDocument; + + if ($ownerDocument === null) { + // TODO convert into a custom ShouldNotHappenException + throw new \RuntimeException('Node does not have an ownerDocument'); + } + + $renderType = $ownerDocument->createElement('renderType'); $renderType->nodeValue = 'selectSingle'; $node->appendChild($renderType); } diff --git a/typo3-fractor/tests/Rules/FlexForm/AddRenderTypeToFlexFormFractorTest.php b/typo3-fractor/tests/Rules/FlexForm/AddRenderTypeToFlexFormFractorTest.php index 287ca224..2a50c2a1 100644 --- a/typo3-fractor/tests/Rules/FlexForm/AddRenderTypeToFlexFormFractorTest.php +++ b/typo3-fractor/tests/Rules/FlexForm/AddRenderTypeToFlexFormFractorTest.php @@ -7,12 +7,14 @@ use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; +use function Safe\file_get_contents; + class AddRenderTypeToFlexFormFractorTest extends TestCase { private const FIXTURE_SEPARATOR = '-----'; /** - * @return array + * @return array */ public static function fixtureFilesProvider(): array { @@ -41,7 +43,7 @@ public function test(string $filePath): void $iterator = new DomDocumentIterator([new AddRenderTypeToFlexFormFractor()]); $iterator->traverseDocument($document); - $result = $document->saveXML(); + $result = $document->saveXML() ?: ''; self::assertXmlStringEqualsXmlString($expectedResultXml, $result); } From 99618b5c9a59199fc4feb2a80d0a75bbd53a22e7 Mon Sep 17 00:00:00 2001 From: Andreas Wolf Date: Fri, 8 Mar 2024 19:22:43 +0100 Subject: [PATCH 9/9] ci: Add PhpUnit to pipeline --- .github/workflows/lint_test_pull_requests.yaml | 7 +++++++ fractor-xml/composer.json | 3 ++- fractor/composer.json | 3 ++- typo3-fractor/composer.json | 3 ++- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/.github/workflows/lint_test_pull_requests.yaml b/.github/workflows/lint_test_pull_requests.yaml index 1ac782da..ba7034b8 100644 --- a/.github/workflows/lint_test_pull_requests.yaml +++ b/.github/workflows/lint_test_pull_requests.yaml @@ -17,8 +17,15 @@ jobs: command: 'normalize --dry-run' - name: PHPStan command: analyze:php + - name: PHPUnit + command: test:php directory: ['extension-installer', 'fractor', 'fractor-xml', 'typo3-fractor'] + exclude: + - directory: extension-installer + composer-command: {name: 'PHPUnit', command: 'test:php'} + name: ${{ matrix.composer-command.name }}/${{ matrix.directory }} + defaults: run: working-directory: ${{ matrix.directory }} diff --git a/fractor-xml/composer.json b/fractor-xml/composer.json index 302a6b6f..333441f4 100644 --- a/fractor-xml/composer.json +++ b/fractor-xml/composer.json @@ -48,6 +48,7 @@ }, "scripts": { "analyze:php": "phpstan analyze", - "style:php": "ecs" + "style:php": "ecs", + "test:php": "phpunit tests/" } } diff --git a/fractor/composer.json b/fractor/composer.json index 6870e80f..bac69afb 100644 --- a/fractor/composer.json +++ b/fractor/composer.json @@ -45,6 +45,7 @@ }, "scripts": { "analyze:php": "phpstan analyze", - "style:php": "ecs" + "style:php": "ecs", + "test:php": "phpunit tests/" } } diff --git a/typo3-fractor/composer.json b/typo3-fractor/composer.json index 479d8de9..a1c4da87 100644 --- a/typo3-fractor/composer.json +++ b/typo3-fractor/composer.json @@ -48,6 +48,7 @@ }, "scripts": { "analyze:php": "phpstan analyze", - "style:php": "ecs" + "style:php": "ecs", + "test:php": "phpunit tests/" } }