fixup! Add Rector Rule to inject normalization methods into export classes

This commit is contained in:
Julien Fastré 2025-03-11 16:21:16 +01:00
parent 21ec96b75c
commit fcc61aa4c0
Signed by: julienfastre
GPG Key ID: BDE2190974723FCB
3 changed files with 153 additions and 22 deletions

View File

@ -1,5 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.5/phpunit.xsd" bootstrap="vendor/autoload.php" executionOrder="depends,defects" beStrictAboutOutputDuringTests="true" failOnRisky="true" failOnWarning="true" colors="true" cacheDirectory="var/cache/phpunit.rector.cache" requireCoverageMetadata="true" beStrictAboutCoverageMetadata="true">
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.5/phpunit.xsd"
bootstrap="vendor/autoload.php"
executionOrder="depends,defects"
beStrictAboutOutputDuringTests="true"
failOnRisky="true"
failOnWarning="true"
colors="true"
cacheDirectory="var/cache/phpunit.rector.cache"
requireCoverageMetadata="true"
beStrictAboutCoverageMetadata="true"
displayDetailsOnTestsThatTriggerWarnings="true">
<testsuites>
<testsuite name="default">
<directory>utils/rector/tests</directory>

View File

@ -78,9 +78,13 @@ class ChillBundleAddNormalizationMethodsOnExportRector extends AbstractRector
foreach ($node->stmts as $k => $stmt) {
if ($stmt instanceof Node\Stmt\TraitUse) {
if (ExportDataNormalizerTrait::class === $stmt->traits[0]->toString()) {
$trait = $stmt->traits[0];
if (str_contains($trait->toString(), ExportDataNormalizerTrait::class)) {
$hasTraitHelper = true;
}
continue;
} elseif (!$stmt instanceof Node\Stmt\ClassMethod) {
continue;
}
@ -97,6 +101,10 @@ class ChillBundleAddNormalizationMethodsOnExportRector extends AbstractRector
}
}
if ($hasDenormalizeMethod && $hasNormalizedMethod && $hasGetVersionMethod) {
return null;
}
$toAddBefore = [];
$toAdd = [];
@ -105,7 +113,10 @@ class ChillBundleAddNormalizationMethodsOnExportRector extends AbstractRector
$propertiesOnForm = $this->getPropertiesOnForm($buildForm);
// if the trait is not present, we add it into the statements
if (!$hasTraitHelper && array_reduce(
if (
!$hasTraitHelper
&& (!$hasNormalizedMethod || !$hasDenormalizeMethod)
&& array_reduce(
$propertiesOnForm,
function (bool $carry, string $item): bool {
if ('entity' === $item || 'date' === $item) {

View File

@ -0,0 +1,109 @@
<?php
use Chill\MainBundle\Export\FilterInterface;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Chill\MainBundle\Export\ExportDataNormalizerTrait;
class MyFilter implements FilterInterface
{
use ExportDataNormalizerTrait;
public function getTitle()
{
return "some title";
}
public function buildForm(\Symfony\Component\Form\FormBuilderInterface $builder)
{
$builder->add('entity', EntityType::class, []);
}
public function getFormDefaultData(): array
{
return [];
}
public function describeAction($data, $format = 'string')
{
return [];
}
public function addRole(): ?string
{
return null;
}
public function alterQuery(\Doctrine\ORM\QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext)
{
// nothing to add here
}
public function applyOn()
{
return ['something'];
}
}
?>
-----
<?php
use Chill\MainBundle\Export\FilterInterface;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Chill\MainBundle\Export\ExportDataNormalizerTrait;
class MyFilter implements FilterInterface
{
use ExportDataNormalizerTrait;
public function getTitle()
{
return "some title";
}
public function buildForm(\Symfony\Component\Form\FormBuilderInterface $builder)
{
$builder->add('entity', EntityType::class, []);
}
public function getNormalizationVersion(): int
{
return 1;
}
public function normalizeFormData(array $formData): array
{
return ['entity' => $this->normalizeDoctrineEntity($formData['entity'])];
}
public function denormalizeFormData(array $formData, int $fromVersion): array
{
return ['entity' => $this->denormalizeDoctrineEntity($formData['entity'], $this->someRepository)];
}
public function getFormDefaultData(): array
{
return [];
}
public function describeAction($data, $format = 'string')
{
return [];
}
public function addRole(): ?string
{
return null;
}
public function alterQuery(\Doctrine\ORM\QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext)
{
// nothing to add here
}
public function applyOn()
{
return ['something'];
}
}
?>