Skip to content

Commit ab7cc3e

Browse files
Merge pull request #65 from andreaswolf/issue-58
[FEATURE] Add fractor-fluid package
2 parents df45ed7 + dfb8758 commit ab7cc3e

15 files changed

+274
-1
lines changed

.github/workflows/lint_test_pull_requests.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ jobs:
2121
command: test:php
2222
- name: Rector
2323
command: 'rector --dry-run'
24-
directory: [ 'extension-installer', 'fractor', 'fractor-xml', 'typo3-fractor', 'fractor-doc-generator', 'fractor-yaml']
24+
directory: [ 'extension-installer', 'fractor', 'fractor-xml', 'typo3-fractor', 'fractor-doc-generator', 'fractor-yaml', 'fractor-fluid']
2525
exclude:
2626
- directory: extension-installer
2727
composer-command: {name: 'PHPUnit', command: 'test:php'}

fractor-fluid/.gitattributes

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
ecs.php export-ignore
2+
phpstan.neon export-ignore
3+
README.md export-ignore
4+
rector.php export-ignore
5+
phpunit.xml export-ignore
6+
tests export-ignore
7+
.gitignore export-ignore

fractor-fluid/.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
/vendor/
2+
/composer.lock
3+
.phpunit.cache

fractor-fluid/composer.json

+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
{
2+
"name": "a9f/fractor-yaml",
3+
"description": "Fluid extension for the File Read-Analyse-Change TOol. Allows modifying Fluid files",
4+
"license": "MIT",
5+
"type": "fractor-extension",
6+
"authors": [
7+
{
8+
"name": "Andreas Wolf",
9+
"email": "[email protected]",
10+
"role": "Lead Developer"
11+
}
12+
],
13+
"require": {
14+
"php": "^8.2",
15+
"a9f/fractor": "@dev",
16+
"a9f/fractor-extension-installer": "@dev",
17+
"nette/utils": "^4.0",
18+
"webmozart/assert": "^1.11"
19+
},
20+
"require-dev": {
21+
"ergebnis/composer-normalize": "^2.42",
22+
"phpstan/phpstan": "^1.10",
23+
"phpunit/phpunit": "^10.5",
24+
"rector/rector": "^1.0",
25+
"symplify/easy-coding-standard": "^12.1"
26+
},
27+
"repositories": {
28+
"fractor": {
29+
"type": "path",
30+
"url": "../*"
31+
}
32+
},
33+
"autoload": {
34+
"psr-4": {
35+
"a9f\\FractorFluid\\": "src/"
36+
}
37+
},
38+
"autoload-dev": {
39+
"psr-4": {
40+
"a9f\\FractorFluid\\Tests\\": "tests/"
41+
}
42+
},
43+
"config": {
44+
"allow-plugins": {
45+
"a9f/fractor-extension-installer": true,
46+
"ergebnis/composer-normalize": true
47+
},
48+
"sort-packages": true
49+
},
50+
"scripts": {
51+
"analyze:php": "phpstan analyze",
52+
"rector": "rector",
53+
"style:php:check": "ecs",
54+
"style:php:fix": "ecs --fix",
55+
"test:php": "phpunit"
56+
}
57+
}

fractor-fluid/config/application.php

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
use a9f\FractorFluid\Contract\FluidFractorRule;
4+
use a9f\FractorFluid\FluidFileProcessor;
5+
use Symfony\Component\DependencyInjection\ContainerBuilder;
6+
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
7+
use function Symfony\Component\DependencyInjection\Loader\Configurator\tagged_iterator;
8+
9+
return static function (ContainerConfigurator $containerConfigurator, ContainerBuilder $containerBuilder): void {
10+
$services = $containerConfigurator->services();
11+
$services->defaults()
12+
->autowire()
13+
->autoconfigure();
14+
15+
$services->load('a9f\\FractorFluid\\', __DIR__ . '/../src/');
16+
17+
$services->set(FluidFileProcessor::class)->arg('$rules', tagged_iterator('fractor.fluid_rule'));
18+
19+
$containerBuilder->registerForAutoconfiguration(FluidFractorRule::class)->addTag('fractor.fluid_rule');
20+
};

fractor-fluid/ecs.php

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
return (include __DIR__ . '/../.build/ecs.php')
6+
->withPaths([
7+
__DIR__ . '/config',
8+
__DIR__ . '/src',
9+
__DIR__ . '/tests',
10+
])
11+
;

fractor-fluid/phpstan.neon

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
parameters:
2+
level: 8
3+
4+
paths:
5+
- src/
6+
- tests/

fractor-fluid/phpunit.xml

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?xml version="1.0"?>
2+
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.5/phpunit.xsd" bootstrap="vendor/autoload.php" colors="true" cacheDirectory=".phpunit.cache">
3+
<testsuites>
4+
<testsuite name="fractor-fluid">
5+
<directory>tests</directory>
6+
</testsuite>
7+
</testsuites>
8+
<source>
9+
<include>
10+
<directory>./src</directory>
11+
</include>
12+
</source>
13+
</phpunit>

fractor-fluid/rector.php

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
return (include __DIR__ . '/../.build/rector.php')
6+
->withPaths([
7+
__DIR__ . '/config',
8+
__DIR__ . '/src',
9+
__DIR__ . '/tests',
10+
]);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace a9f\FractorFluid\Contract;
6+
7+
use a9f\Fractor\Application\Contract\FractorRule;
8+
9+
interface FluidFractorRule extends FractorRule
10+
{
11+
public function refactor(string $fluid): string;
12+
}
+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace a9f\FractorFluid;
6+
7+
use a9f\Fractor\Application\Contract\FileProcessor;
8+
use a9f\Fractor\Application\ValueObject\AppliedRule;
9+
use a9f\Fractor\Application\ValueObject\File;
10+
use a9f\FractorFluid\Contract\FluidFractorRule;
11+
use Webmozart\Assert\Assert;
12+
13+
final readonly class FluidFileProcessor implements FileProcessor
14+
{
15+
/**
16+
* @param iterable<FluidFractorRule> $rules
17+
*/
18+
public function __construct(private iterable $rules)
19+
{
20+
Assert::allIsInstanceOf($this->rules, FluidFractorRule::class);
21+
}
22+
23+
public function canHandle(File $file): bool
24+
{
25+
return in_array($file->getFileExtension(), $this->allowedFileExtensions(), true);
26+
}
27+
28+
public function handle(File $file): void
29+
{
30+
foreach ($this->rules as $rule) {
31+
$newContent = $rule->refactor($file->getContent());
32+
33+
if ($newContent !== $file->getContent()) {
34+
$file->changeFileContent($newContent);
35+
$file->addAppliedRule(AppliedRule::fromRule($rule));
36+
}
37+
}
38+
}
39+
40+
public function allowedFileExtensions(): array
41+
{
42+
return ['html', 'xml', 'txt'];
43+
}
44+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace a9f\FractorFluid\Tests\Fixtures;
6+
7+
use a9f\FractorFluid\Contract\FluidFractorRule;
8+
use Nette\Utils\Strings;
9+
use Symfony\Component\DependencyInjection\Exception\BadMethodCallException;
10+
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
11+
12+
final class DummyFluidFractorRule implements FluidFractorRule
13+
{
14+
public function getRuleDefinition(): RuleDefinition
15+
{
16+
throw new BadMethodCallException('Not implemented yet');
17+
}
18+
19+
public function refactor(string $fluid): string
20+
{
21+
$fluid = Strings::replace($fluid, '# noCacheHash="(1|0|true|false)"#imsU', '');
22+
23+
return Strings::replace($fluid, '# useCacheHash="(1|0|true|false)"#imsU', '');
24+
}
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<f:link.page addQueryString="1" noCacheHash="1">Link</f:link.page>
2+
<f:link.page addQueryString="1" noCacheHash="1">Link</f:link.page>
3+
<f:link.page noCacheHash="0">Link</f:link.page>
4+
<f:link.typolink useCacheHash="1">Link</f:link.typolink>
5+
<f:link.typolink useCacheHash="0">Link</f:link.typolink>
6+
<f:uri.typolink parameter="{link}" additionalParams="&u=b" useCacheHash="true" />
7+
-----
8+
<f:link.page addQueryString="1">Link</f:link.page>
9+
<f:link.page addQueryString="1">Link</f:link.page>
10+
<f:link.page>Link</f:link.page>
11+
<f:link.typolink>Link</f:link.typolink>
12+
<f:link.typolink>Link</f:link.typolink>
13+
<f:uri.typolink parameter="{link}" additionalParams="&u=b" />
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace a9f\FractorFluid\Tests\FluidFileProcessor;
6+
7+
use a9f\Fractor\Application\ValueObject\AppliedRule;
8+
use a9f\Fractor\Application\ValueObject\File;
9+
use a9f\Fractor\Testing\PHPUnit\AbstractFractorTestCase;
10+
use a9f\FractorFluid\Tests\Fixtures\DummyFluidFractorRule;
11+
use Iterator;
12+
use PHPUnit\Framework\Attributes\DataProvider;
13+
14+
final class FluidFileProcessorTest extends AbstractFractorTestCase
15+
{
16+
#[DataProvider('provideData')]
17+
public function test(string $filePath): void
18+
{
19+
$this->doTestFile($filePath);
20+
21+
$file = $this->fileCollector->getFileByPath($filePath);
22+
self::assertInstanceOf(File::class, $file);
23+
self::assertEquals([AppliedRule::fromClassString(DummyFluidFractorRule::class)], $file->getAppliedRules());
24+
}
25+
26+
public static function provideData(): Iterator
27+
{
28+
return self::yieldFilesFromDirectory(__DIR__ . '/Fixtures', '*.html');
29+
}
30+
31+
protected function additionalConfigurationFiles(): array
32+
{
33+
return [
34+
__DIR__ . '/config/config.php',
35+
];
36+
}
37+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
use a9f\FractorFluid\Tests\Fixtures\DummyFluidFractorRule;
4+
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
5+
6+
return static function (ContainerConfigurator $containerConfigurator): void {
7+
$containerConfigurator->import(__DIR__ . '/../../../config/application.php');
8+
9+
$services = $containerConfigurator->services();
10+
$services->defaults()
11+
->autowire()
12+
->autoconfigure();
13+
14+
$services->set(DummyFluidFractorRule::class);
15+
};

0 commit comments

Comments
 (0)