Skip to content

Commit 31957a7

Browse files
simonschaufisabbelasichon
authored andcommitted
[FEATURE] Add MigrateEmailFlagToEmailTypeFlexFormFractor
1 parent e32c828 commit 31957a7

24 files changed

+711
-60
lines changed

composer.json

+19-17
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
"eta-orionis/composer-json-manipulator": "^1.0",
1919
"nette/utils": "^4.0",
2020
"sebastian/diff": "^5.0",
21+
"shanethehat/pretty-xml": "^1.0",
2122
"symfony/config": "^6.4",
2223
"symfony/console": "^6.4",
2324
"symfony/dependency-injection": "^6.4",
@@ -92,18 +93,32 @@
9293
"class": "a9f\\FractorExtensionInstaller\\InstallerPlugin"
9394
},
9495
"scripts": {
96+
"post-install-cmd": [
97+
"@auto-scripts"
98+
],
99+
"post-update-cmd": [
100+
"@auto-scripts"
101+
],
102+
"analyze:php": "phpstan analyze",
95103
"auto-scripts": {
96104
"fractor:installer": "a9f\\FractorMonorepo\\Composer\\Scripts\\FractorPackageInstaller::generate"
97105
},
98-
"analyze:php": "phpstan analyze",
99106
"contribute": [
107+
"@merge-composer-json",
100108
"@style:composer:normalize:fix",
101-
"@merge-composer-json"
109+
"@style:php:fix"
102110
],
103111
"docs": [
104112
"fractor-doc-generator generate packages/typo3-fractor/rules --output-file packages/typo3-fractor/docs/typo3-fractor-rules.md",
105113
"fractor-doc-generator generate packages/fractor-composer-json/rules --output-file packages/fractor-composer-json/docs/composer-json-fractor-rules.md"
106114
],
115+
"local:contribute": [
116+
"@rectify",
117+
"@analyze:php",
118+
"@style:php:fix",
119+
"@style:composer:normalize:fix",
120+
"@test:php"
121+
],
107122
"merge-composer-json": "monorepo-builder merge",
108123
"propagate": "monorepo-builder propagate",
109124
"rectify": "rector",
@@ -121,6 +136,7 @@
121136
"@composer normalize --dry-run packages/typo3-fractor/composer.json"
122137
],
123138
"style:composer:normalize:fix": [
139+
"@composer normalize --no-check-lock composer.json",
124140
"@composer normalize --no-check-lock e2e/composer.json",
125141
"@composer normalize --no-check-lock packages/extension-installer/composer.json",
126142
"@composer normalize --no-check-lock packages/fractor/composer.json",
@@ -131,23 +147,9 @@
131147
"@composer normalize --no-check-lock packages/fractor-yaml/composer.json",
132148
"@composer normalize --no-check-lock packages/typo3-fractor/composer.json"
133149
],
134-
"local:contribute": [
135-
"@rectify",
136-
"@analyze:php",
137-
"@style:php:fix",
138-
"@style:composer:normalize:fix",
139-
"@test:php"
140-
],
141150
"style:php:check": "ecs",
142151
"style:php:fix": "ecs --fix",
143152
"test:php": "phpunit",
144-
"validate-monorepo": "monorepo-builder validate",
145-
"post-install-cmd": [
146-
"@auto-scripts"
147-
],
148-
"post-update-cmd": [
149-
"@auto-scripts"
150-
]
153+
"validate-monorepo": "monorepo-builder validate"
151154
}
152-
153155
}

packages/fractor-xml/composer.json

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"ext-xml": "*",
1717
"a9f/fractor": "^0.2",
1818
"a9f/fractor-extension-installer": "^0.2",
19+
"shanethehat/pretty-xml": "^1.0",
1920
"webmozart/assert": "^1.11"
2021
},
2122
"require-dev": {

packages/fractor-xml/config/application.php

+5
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
declare(strict_types=1);
44

5+
use a9f\FractorXml\Contract\Formatter;
56
use a9f\FractorXml\Contract\XmlFractor;
7+
use a9f\FractorXml\PrettyXmlFormatter;
68
use a9f\FractorXml\XmlFileProcessor;
79
use Symfony\Component\DependencyInjection\ContainerBuilder;
810
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
@@ -19,5 +21,8 @@
1921
$services->set(XmlFileProcessor::class)
2022
->arg('$rules', tagged_iterator('fractor.xml_rule'));
2123

24+
$services->set(\PrettyXml\Formatter::class);
25+
$services->alias(Formatter::class, PrettyXmlFormatter::class);
26+
2227
$containerBuilder->registerForAutoconfiguration(XmlFractor::class)->addTag('fractor.xml_rule');
2328
};

packages/fractor-xml/src/AbstractXmlFractor.php

+3-3
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@
1212

1313
abstract class AbstractXmlFractor implements DomNodeVisitor, XmlFractor
1414
{
15-
private ?File $file = null;
15+
protected ?File $file = null;
1616

17-
public function beforeTraversal(File $file, \DOMNode $rootNode): void
17+
public function beforeTraversal(File $file, \DOMDocument $rootNode): void
1818
{
1919
$this->file = $file;
2020
}
@@ -41,7 +41,7 @@ public function leaveNode(\DOMNode $node): void
4141
// no-op for now
4242
}
4343

44-
public function afterTraversal(\DOMNode $rootNode): void
44+
public function afterTraversal(\DOMDocument $rootNode): void
4545
{
4646
// no-op for now
4747
}

packages/fractor-xml/src/Contract/DomNodeVisitor.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
*/
1313
interface DomNodeVisitor
1414
{
15-
public function beforeTraversal(File $file, \DOMNode $rootNode): void;
15+
public function beforeTraversal(File $file, \DOMDocument $rootNode): void;
1616

1717
/**
1818
* @return \DOMNode|DomDocumentIterator::*
@@ -21,5 +21,5 @@ public function enterNode(\DOMNode $node): \DOMNode|int;
2121

2222
public function leaveNode(\DOMNode $node): void;
2323

24-
public function afterTraversal(\DOMNode $rootNode): void;
24+
public function afterTraversal(\DOMDocument $rootNode): void;
2525
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace a9f\FractorXml\Contract;
6+
7+
use a9f\Fractor\ValueObject\Indent;
8+
9+
interface Formatter
10+
{
11+
public function format(Indent $indent, string $content): string;
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace a9f\FractorXml;
6+
7+
use a9f\Fractor\ValueObject\Indent;
8+
use a9f\FractorXml\Contract\Formatter;
9+
10+
final readonly class PrettyXmlFormatter implements Formatter
11+
{
12+
public function __construct(
13+
private \PrettyXml\Formatter $prettyXmlFormatter
14+
) {
15+
}
16+
17+
public function format(Indent $indent, string $content): string
18+
{
19+
$indentCharacter = $indent->isSpace() ? Indent::CHARACTERS[Indent::STYLE_SPACE] : Indent::CHARACTERS[Indent::STYLE_TAB];
20+
$this->prettyXmlFormatter->setIndentCharacter($indentCharacter);
21+
$this->prettyXmlFormatter->setIndentSize($indent->length());
22+
23+
return $this->prettyXmlFormatter->format($content);
24+
}
25+
}

packages/fractor-xml/src/XmlFileProcessor.php

+6
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
use a9f\Fractor\Application\Contract\FileProcessor;
88
use a9f\Fractor\Application\ValueObject\File;
99
use a9f\Fractor\Exception\ShouldNotHappenException;
10+
use a9f\Fractor\ValueObject\Indent;
11+
use a9f\FractorXml\Contract\Formatter;
1012
use a9f\FractorXml\Contract\XmlFractor;
1113
use a9f\FractorXml\ValueObjectFactory\DomDocumentFactory;
1214

@@ -20,6 +22,7 @@
2022
*/
2123
public function __construct(
2224
private DomDocumentFactory $domDocumentFactory,
25+
private Formatter $formatter,
2326
private iterable $rules
2427
) {
2528
}
@@ -43,6 +46,9 @@ public function handle(File $file, iterable $appliedRules): void
4346

4447
$newXml = $this->saveXml($document);
4548

49+
// TODO make the indentation configurable in fractor config
50+
$newXml = $this->formatter->format(Indent::fromSizeAndStyle(4, Indent::STYLE_SPACE), $newXml);
51+
4652
if ($newXml === $originalXml) {
4753
return;
4854
}

packages/fractor-xml/tests/DomDocumentIteratorTest.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ public function __construct(
231231
) {
232232
}
233233

234-
public function beforeTraversal(File $file, \DOMNode $rootNode): void
234+
public function beforeTraversal(File $file, \DOMDocument $rootNode): void
235235
{
236236
$this->calls[] = sprintf('%s:beforeTraversal:%s', $this->visitorName, $rootNode->nodeName);
237237
}
@@ -247,7 +247,7 @@ public function leaveNode(\DOMNode $node): void
247247
$this->calls[] = sprintf('%s:leaveNode:%s', $this->visitorName, $node->nodeName);
248248
}
249249

250-
public function afterTraversal(\DOMNode $rootNode): void
250+
public function afterTraversal(\DOMDocument $rootNode): void
251251
{
252252
$this->calls[] = sprintf('%s:afterTraversal:%s', $this->visitorName, $rootNode->nodeName);
253253
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace a9f\Fractor\Helper;
6+
7+
class ArrayUtility
8+
{
9+
/**
10+
* @return string[]
11+
*
12+
* @see GeneralUtility::trimExplode in TYPO3 Core
13+
*/
14+
public static function trimExplode(string $delimiter, string $string, bool $removeEmptyValues = false): array
15+
{
16+
if ($delimiter === '') {
17+
throw new \InvalidArgumentException('Please define a correct delimiter');
18+
}
19+
20+
$result = explode($delimiter, $string);
21+
22+
if ($removeEmptyValues) {
23+
$temp = [];
24+
foreach ($result as $value) {
25+
if (trim($value) !== '') {
26+
$temp[] = $value;
27+
}
28+
}
29+
30+
$result = $temp;
31+
}
32+
33+
return array_map('trim', $result);
34+
}
35+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace a9f\Fractor\Helper;
6+
7+
class StringUtility
8+
{
9+
/**
10+
* Check if an item exists in a comma-separated list of items.
11+
*
12+
* @param string $list Comma-separated list of items (string)
13+
* @param string $item Item to check for
14+
* @return bool TRUE if $item is in $list
15+
*
16+
* @see GeneralUtility::inList in TYPO3 Core
17+
*/
18+
public static function inList(string $list, string $item): bool
19+
{
20+
return str_contains(',' . $list . ',', ',' . $item . ',');
21+
}
22+
}

packages/fractor/src/ValueObject/Indent.php

+10-3
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,16 @@
1212
*/
1313
final readonly class Indent
1414
{
15+
public const STYLE_SPACE = 'space';
16+
17+
public const STYLE_TAB = 'tab';
18+
1519
/**
1620
* @var array<string, string>
1721
*/
1822
public const CHARACTERS = [
19-
'space' => ' ',
20-
'tab' => "\t",
23+
self::STYLE_SPACE => ' ',
24+
self::STYLE_TAB => "\t",
2125
];
2226

2327
private function __construct(
@@ -49,7 +53,10 @@ public function length(): int
4953
return strlen($this->value);
5054
}
5155

52-
private static function fromSizeAndStyle(int $size, string $style): self
56+
/**
57+
* @phpstan-param self::STYLE_* $style
58+
*/
59+
public static function fromSizeAndStyle(int $size, string $style): self
5360
{
5461
Assert::greaterThanEq($size, 1);
5562
Assert::keyExists(self::CHARACTERS, $style);

0 commit comments

Comments
 (0)