From dfb8758a71e41374cb48d1b55b711b4c587ac0e1 Mon Sep 17 00:00:00 2001 From: Sebastian Schreiber Date: Fri, 10 May 2024 13:55:22 +0200 Subject: [PATCH] [FEATURE] Add fractor-fluid package Resolves: #58 --- .../workflows/lint_test_pull_requests.yaml | 2 +- fractor-fluid/.gitattributes | 7 +++ fractor-fluid/.gitignore | 3 + fractor-fluid/composer.json | 57 +++++++++++++++++++ fractor-fluid/config/application.php | 20 +++++++ fractor-fluid/ecs.php | 11 ++++ fractor-fluid/phpstan.neon | 6 ++ fractor-fluid/phpunit.xml | 13 +++++ fractor-fluid/rector.php | 10 ++++ .../src/Contract/FluidFractorRule.php | 12 ++++ fractor-fluid/src/FluidFileProcessor.php | 44 ++++++++++++++ .../tests/Fixtures/DummyFluidFractorRule.php | 25 ++++++++ .../FluidFileProcessor/Fixtures/fluid.html | 13 +++++ .../FluidFileProcessorTest.php | 37 ++++++++++++ .../FluidFileProcessor/config/config.php | 15 +++++ 15 files changed, 274 insertions(+), 1 deletion(-) create mode 100644 fractor-fluid/.gitattributes create mode 100644 fractor-fluid/.gitignore create mode 100644 fractor-fluid/composer.json create mode 100644 fractor-fluid/config/application.php create mode 100644 fractor-fluid/ecs.php create mode 100644 fractor-fluid/phpstan.neon create mode 100644 fractor-fluid/phpunit.xml create mode 100644 fractor-fluid/rector.php create mode 100644 fractor-fluid/src/Contract/FluidFractorRule.php create mode 100644 fractor-fluid/src/FluidFileProcessor.php create mode 100644 fractor-fluid/tests/Fixtures/DummyFluidFractorRule.php create mode 100644 fractor-fluid/tests/FluidFileProcessor/Fixtures/fluid.html create mode 100644 fractor-fluid/tests/FluidFileProcessor/FluidFileProcessorTest.php create mode 100644 fractor-fluid/tests/FluidFileProcessor/config/config.php diff --git a/.github/workflows/lint_test_pull_requests.yaml b/.github/workflows/lint_test_pull_requests.yaml index 4ac8d326..ae318076 100644 --- a/.github/workflows/lint_test_pull_requests.yaml +++ b/.github/workflows/lint_test_pull_requests.yaml @@ -21,7 +21,7 @@ jobs: command: test:php - name: Rector command: 'rector --dry-run' - directory: [ 'extension-installer', 'fractor', 'fractor-xml', 'typo3-fractor', 'fractor-doc-generator', 'fractor-yaml'] + directory: [ 'extension-installer', 'fractor', 'fractor-xml', 'typo3-fractor', 'fractor-doc-generator', 'fractor-yaml', 'fractor-fluid'] exclude: - directory: extension-installer composer-command: {name: 'PHPUnit', command: 'test:php'} diff --git a/fractor-fluid/.gitattributes b/fractor-fluid/.gitattributes new file mode 100644 index 00000000..8b1b1e8f --- /dev/null +++ b/fractor-fluid/.gitattributes @@ -0,0 +1,7 @@ +ecs.php export-ignore +phpstan.neon export-ignore +README.md export-ignore +rector.php export-ignore +phpunit.xml export-ignore +tests export-ignore +.gitignore export-ignore \ No newline at end of file diff --git a/fractor-fluid/.gitignore b/fractor-fluid/.gitignore new file mode 100644 index 00000000..a89e45ef --- /dev/null +++ b/fractor-fluid/.gitignore @@ -0,0 +1,3 @@ +/vendor/ +/composer.lock +.phpunit.cache \ No newline at end of file diff --git a/fractor-fluid/composer.json b/fractor-fluid/composer.json new file mode 100644 index 00000000..e6b03442 --- /dev/null +++ b/fractor-fluid/composer.json @@ -0,0 +1,57 @@ +{ + "name": "a9f/fractor-yaml", + "description": "Fluid extension for the File Read-Analyse-Change TOol. Allows modifying Fluid files", + "license": "MIT", + "type": "fractor-extension", + "authors": [ + { + "name": "Andreas Wolf", + "email": "dev@a-w.io", + "role": "Lead Developer" + } + ], + "require": { + "php": "^8.2", + "a9f/fractor": "@dev", + "a9f/fractor-extension-installer": "@dev", + "nette/utils": "^4.0", + "webmozart/assert": "^1.11" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.42", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "rector/rector": "^1.0", + "symplify/easy-coding-standard": "^12.1" + }, + "repositories": { + "fractor": { + "type": "path", + "url": "../*" + } + }, + "autoload": { + "psr-4": { + "a9f\\FractorFluid\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "a9f\\FractorFluid\\Tests\\": "tests/" + } + }, + "config": { + "allow-plugins": { + "a9f/fractor-extension-installer": true, + "ergebnis/composer-normalize": true + }, + "sort-packages": true + }, + "scripts": { + "analyze:php": "phpstan analyze", + "rector": "rector", + "style:php:check": "ecs", + "style:php:fix": "ecs --fix", + "test:php": "phpunit" + } +} diff --git a/fractor-fluid/config/application.php b/fractor-fluid/config/application.php new file mode 100644 index 00000000..6eae61cf --- /dev/null +++ b/fractor-fluid/config/application.php @@ -0,0 +1,20 @@ +services(); + $services->defaults() + ->autowire() + ->autoconfigure(); + + $services->load('a9f\\FractorFluid\\', __DIR__ . '/../src/'); + + $services->set(FluidFileProcessor::class)->arg('$rules', tagged_iterator('fractor.fluid_rule')); + + $containerBuilder->registerForAutoconfiguration(FluidFractorRule::class)->addTag('fractor.fluid_rule'); +}; diff --git a/fractor-fluid/ecs.php b/fractor-fluid/ecs.php new file mode 100644 index 00000000..5ce15d44 --- /dev/null +++ b/fractor-fluid/ecs.php @@ -0,0 +1,11 @@ +withPaths([ + __DIR__ . '/config', + __DIR__ . '/src', + __DIR__ . '/tests', + ]) + ; diff --git a/fractor-fluid/phpstan.neon b/fractor-fluid/phpstan.neon new file mode 100644 index 00000000..dd7c8e94 --- /dev/null +++ b/fractor-fluid/phpstan.neon @@ -0,0 +1,6 @@ +parameters: + level: 8 + + paths: + - src/ + - tests/ diff --git a/fractor-fluid/phpunit.xml b/fractor-fluid/phpunit.xml new file mode 100644 index 00000000..c92e01fa --- /dev/null +++ b/fractor-fluid/phpunit.xml @@ -0,0 +1,13 @@ + + + + + tests + + + + + ./src + + + diff --git a/fractor-fluid/rector.php b/fractor-fluid/rector.php new file mode 100644 index 00000000..d547b84f --- /dev/null +++ b/fractor-fluid/rector.php @@ -0,0 +1,10 @@ +withPaths([ + __DIR__ . '/config', + __DIR__ . '/src', + __DIR__ . '/tests', + ]); diff --git a/fractor-fluid/src/Contract/FluidFractorRule.php b/fractor-fluid/src/Contract/FluidFractorRule.php new file mode 100644 index 00000000..a6585b27 --- /dev/null +++ b/fractor-fluid/src/Contract/FluidFractorRule.php @@ -0,0 +1,12 @@ + $rules + */ + public function __construct(private iterable $rules) + { + Assert::allIsInstanceOf($this->rules, FluidFractorRule::class); + } + + public function canHandle(File $file): bool + { + return in_array($file->getFileExtension(), $this->allowedFileExtensions(), true); + } + + public function handle(File $file): void + { + foreach ($this->rules as $rule) { + $newContent = $rule->refactor($file->getContent()); + + if ($newContent !== $file->getContent()) { + $file->changeFileContent($newContent); + $file->addAppliedRule(AppliedRule::fromRule($rule)); + } + } + } + + public function allowedFileExtensions(): array + { + return ['html', 'xml', 'txt']; + } +} diff --git a/fractor-fluid/tests/Fixtures/DummyFluidFractorRule.php b/fractor-fluid/tests/Fixtures/DummyFluidFractorRule.php new file mode 100644 index 00000000..bf95303d --- /dev/null +++ b/fractor-fluid/tests/Fixtures/DummyFluidFractorRule.php @@ -0,0 +1,25 @@ +Link +Link +Link +Link +Link + +----- +Link +Link +Link +Link +Link + \ No newline at end of file diff --git a/fractor-fluid/tests/FluidFileProcessor/FluidFileProcessorTest.php b/fractor-fluid/tests/FluidFileProcessor/FluidFileProcessorTest.php new file mode 100644 index 00000000..a4b37821 --- /dev/null +++ b/fractor-fluid/tests/FluidFileProcessor/FluidFileProcessorTest.php @@ -0,0 +1,37 @@ +doTestFile($filePath); + + $file = $this->fileCollector->getFileByPath($filePath); + self::assertInstanceOf(File::class, $file); + self::assertEquals([AppliedRule::fromClassString(DummyFluidFractorRule::class)], $file->getAppliedRules()); + } + + public static function provideData(): Iterator + { + return self::yieldFilesFromDirectory(__DIR__ . '/Fixtures', '*.html'); + } + + protected function additionalConfigurationFiles(): array + { + return [ + __DIR__ . '/config/config.php', + ]; + } +} diff --git a/fractor-fluid/tests/FluidFileProcessor/config/config.php b/fractor-fluid/tests/FluidFileProcessor/config/config.php new file mode 100644 index 00000000..0d1c0b29 --- /dev/null +++ b/fractor-fluid/tests/FluidFileProcessor/config/config.php @@ -0,0 +1,15 @@ +import(__DIR__ . '/../../../config/application.php'); + + $services = $containerConfigurator->services(); + $services->defaults() + ->autowire() + ->autoconfigure(); + + $services->set(DummyFluidFractorRule::class); +};