From 2026dfba71acbb320246e7a9170bec1d11d8a5ab Mon Sep 17 00:00:00 2001 From: David Badura Date: Fri, 27 Feb 2026 09:47:37 +0100 Subject: [PATCH] rename metadata hydrator into stack hydrator --- README.md | 16 ++++---- phpstan-baseline.neon | 24 +++++------ src/CoreExtension.php | 2 +- src/Extension.php | 2 +- .../Cryptography/CryptographyExtension.php | 4 +- .../Lifecycle/LifecycleExtension.php | 4 +- ...MetadataHydrator.php => StackHydrator.php} | 2 +- ...orBuilder.php => StackHydratorBuilder.php} | 6 +-- tests/Benchmark/HydratorBench.php | 4 +- .../HydratorWithCryptographyBench.php | 4 +- tests/Benchmark/HydratorWithLazyBench.php | 4 +- .../Lifecycle/LifecycleExtensionTest.php | 4 +- ...rTest.php => StackHydratorBuilderTest.php} | 41 ++++++++----------- ...HydratorTest.php => StackHydratorTest.php} | 16 ++++---- 14 files changed, 63 insertions(+), 70 deletions(-) rename src/{MetadataHydrator.php => StackHydrator.php} (98%) rename src/{HydratorBuilder.php => StackHydratorBuilder.php} (96%) rename tests/Unit/{HydratorBuilderTest.php => StackHydratorBuilderTest.php} (78%) rename tests/Unit/{MetadataHydratorTest.php => StackHydratorTest.php} (98%) diff --git a/README.md b/README.md index 9ba6fece..10a146b3 100644 --- a/README.md +++ b/README.md @@ -27,9 +27,9 @@ composer require patchlevel/hydrator To use the hydrator you just have to create an instance of it. ```php -use Patchlevel\Hydrator\MetadataHydrator; +use Patchlevel\Hydrator\StackHydrator; -$hydrator = MetadataHydrator::create(); +$hydrator = StackHydrator::create(); ``` After that you can hydrate any classes or objects. Also `final`, `readonly` classes with `property promotion`. @@ -483,9 +483,9 @@ class NameGuesser implements Guesser To use this Guesser, you must specify it when creating the Hydrator: ```php -use Patchlevel\Hydrator\MetadataHydrator; +use Patchlevel\Hydrator\StackHydrator; -$hydrator = MetadataHydrator::create([new NameGuesser()]); +$hydrator = StackHydrator::create([new NameGuesser()]); ``` > [!NOTE] @@ -595,7 +595,7 @@ For this functionality we use the [symfony/event-dispatcher](https://symfony.com use Patchlevel\Hydrator\Cryptography\SensitiveDataPayloadCryptographer; use Patchlevel\Hydrator\Cryptography\Store\CipherKeyStore; use Patchlevel\Hydrator\Metadata\Event\EventMetadataFactory; -use Patchlevel\Hydrator\MetadataHydrator; +use Patchlevel\Hydrator\StackHydrator; use Symfony\Component\EventDispatcher\EventDispatcher; use Patchlevel\Hydrator\Event\PostExtract; use Patchlevel\Hydrator\Event\PreHydrate; @@ -616,7 +616,7 @@ $eventDispatcher->addListener( } ); -$hydrator = new MetadataHydrator(eventDispatcher: $eventDispatcher); +$hydrator = new StackHydrator(eventDispatcher: $eventDispatcher); ``` ### Cryptography @@ -742,11 +742,11 @@ Here we show you how to configure the cryptography. use Patchlevel\Hydrator\Cryptography\SensitiveDataPayloadCryptographer; use Patchlevel\Hydrator\Cryptography\Store\CipherKeyStore; use Patchlevel\Hydrator\Metadata\Event\EventMetadataFactory; -use Patchlevel\Hydrator\MetadataHydrator; +use Patchlevel\Hydrator\StackHydrator; $cipherKeyStore = new InMemoryCipherKeyStore(); $cryptographer = SensitiveDataPayloadCryptographer::createWithDefaultSettings($cipherKeyStore); -$hydrator = new MetadataHydrator(cryptographer: $cryptographer); +$hydrator = new StackHydrator(cryptographer: $cryptographer); ``` > [!WARNING] diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index d2301971..2ae0b980 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -72,12 +72,6 @@ parameters: count: 1 path: src/Metadata/ClassMetadata.php - - - message: '#^Parameter \#2 \$data of method Patchlevel\\Hydrator\\Middleware\\Middleware\:\:hydrate\(\) expects array\, array\ given\.$#' - identifier: argument.type - count: 3 - path: src/MetadataHydrator.php - - message: '#^Property Patchlevel\\Hydrator\\Normalizer\\EnumNormalizer\:\:\$enum \(class\-string\\|null\) does not accept string\.$#' identifier: assign.propertyType @@ -90,6 +84,12 @@ parameters: count: 1 path: src/Normalizer/ObjectNormalizer.php + - + message: '#^Parameter \#2 \$data of method Patchlevel\\Hydrator\\Middleware\\Middleware\:\:hydrate\(\) expects array\, array\ given\.$#' + identifier: argument.type + count: 3 + path: src/StackHydrator.php + - message: '#^Property Patchlevel\\Hydrator\\Tests\\Unit\\Extension\\Cryptography\\Fixture\\ChildWithSensitiveDataWithIdentifierDto\:\:\$email is never read, only written\.$#' identifier: property.onlyWritten @@ -108,12 +108,6 @@ parameters: count: 1 path: tests/Unit/Metadata/AttributeMetadataFactoryTest.php - - - message: '#^Parameter \#1 \$class of method Patchlevel\\Hydrator\\MetadataHydrator\:\:hydrate\(\) expects class\-string\, string given\.$#' - identifier: argument.type - count: 1 - path: tests/Unit/MetadataHydratorTest.php - - message: '#^Cannot cast mixed to int\.$#' identifier: cast.int @@ -137,3 +131,9 @@ parameters: identifier: cast.string count: 2 path: tests/Unit/Normalizer/ArrayShapeNormalizerTest.php + + - + message: '#^Parameter \#1 \$class of method Patchlevel\\Hydrator\\StackHydrator\:\:hydrate\(\) expects class\-string\, string given\.$#' + identifier: argument.type + count: 1 + path: tests/Unit/StackHydratorTest.php diff --git a/src/CoreExtension.php b/src/CoreExtension.php index da16662d..81cce0df 100644 --- a/src/CoreExtension.php +++ b/src/CoreExtension.php @@ -9,7 +9,7 @@ final class CoreExtension implements Extension { - public function configure(HydratorBuilder $builder): void + public function configure(StackHydratorBuilder $builder): void { $builder->addMiddleware(new TransformMiddleware(), -64); $builder->addGuesser(new BuiltInGuesser(), -64); diff --git a/src/Extension.php b/src/Extension.php index 60a1160f..723e3052 100644 --- a/src/Extension.php +++ b/src/Extension.php @@ -6,5 +6,5 @@ interface Extension { - public function configure(HydratorBuilder $builder): void; + public function configure(StackHydratorBuilder $builder): void; } diff --git a/src/Extension/Cryptography/CryptographyExtension.php b/src/Extension/Cryptography/CryptographyExtension.php index e43ad572..0274a9d6 100644 --- a/src/Extension/Cryptography/CryptographyExtension.php +++ b/src/Extension/Cryptography/CryptographyExtension.php @@ -5,7 +5,7 @@ namespace Patchlevel\Hydrator\Extension\Cryptography; use Patchlevel\Hydrator\Extension; -use Patchlevel\Hydrator\HydratorBuilder; +use Patchlevel\Hydrator\StackHydratorBuilder; final class CryptographyExtension implements Extension { @@ -14,7 +14,7 @@ public function __construct( ) { } - public function configure(HydratorBuilder $builder): void + public function configure(StackHydratorBuilder $builder): void { $builder->addMetadataEnricher(new CryptographyMetadataEnricher(), 64); $builder->addMiddleware(new CryptographyMiddleware($this->cryptography), 64); diff --git a/src/Extension/Lifecycle/LifecycleExtension.php b/src/Extension/Lifecycle/LifecycleExtension.php index b46668fd..1bfa0d5c 100644 --- a/src/Extension/Lifecycle/LifecycleExtension.php +++ b/src/Extension/Lifecycle/LifecycleExtension.php @@ -5,11 +5,11 @@ namespace Patchlevel\Hydrator\Extension\Lifecycle; use Patchlevel\Hydrator\Extension; -use Patchlevel\Hydrator\HydratorBuilder; +use Patchlevel\Hydrator\StackHydratorBuilder; final readonly class LifecycleExtension implements Extension { - public function configure(HydratorBuilder $builder): void + public function configure(StackHydratorBuilder $builder): void { $builder->addMiddleware(new LifecycleMiddleware()); $builder->addMetadataEnricher(new LifecycleMetadataEnricher()); diff --git a/src/MetadataHydrator.php b/src/StackHydrator.php similarity index 98% rename from src/MetadataHydrator.php rename to src/StackHydrator.php index afc507f4..8be76565 100644 --- a/src/MetadataHydrator.php +++ b/src/StackHydrator.php @@ -19,7 +19,7 @@ use const PHP_VERSION_ID; -final class MetadataHydrator implements Hydrator +final class StackHydrator implements Hydrator { /** @var array */ private array $classMetadata = []; diff --git a/src/HydratorBuilder.php b/src/StackHydratorBuilder.php similarity index 96% rename from src/HydratorBuilder.php rename to src/StackHydratorBuilder.php index 31a2061b..39c5b9b6 100644 --- a/src/HydratorBuilder.php +++ b/src/StackHydratorBuilder.php @@ -18,7 +18,7 @@ use function array_merge; use function krsort; -final class HydratorBuilder +final class StackHydratorBuilder { private bool $defaultLazy = false; @@ -78,7 +78,7 @@ public function setCache(CacheItemPoolInterface|CacheInterface|null $cache): sta return $this; } - public function build(): Hydrator + public function build(): StackHydrator { krsort($this->guessers); krsort($this->metadataEnrichers); @@ -99,7 +99,7 @@ public function build(): Hydrator $metadataFactory = new Psr16MetadataFactory($metadataFactory, $this->cache); } - return new MetadataHydrator( + return new StackHydrator( $metadataFactory, array_merge(...$this->middlewares), $this->defaultLazy, diff --git a/tests/Benchmark/HydratorBench.php b/tests/Benchmark/HydratorBench.php index 9120b38f..0af5f89c 100644 --- a/tests/Benchmark/HydratorBench.php +++ b/tests/Benchmark/HydratorBench.php @@ -6,7 +6,7 @@ use Patchlevel\Hydrator\CoreExtension; use Patchlevel\Hydrator\Hydrator; -use Patchlevel\Hydrator\HydratorBuilder; +use Patchlevel\Hydrator\StackHydratorBuilder; use Patchlevel\Hydrator\Tests\Benchmark\Fixture\ProfileCreated; use Patchlevel\Hydrator\Tests\Benchmark\Fixture\ProfileId; use Patchlevel\Hydrator\Tests\Benchmark\Fixture\Skill; @@ -19,7 +19,7 @@ final class HydratorBench public function __construct() { - $this->hydrator = (new HydratorBuilder()) + $this->hydrator = (new StackHydratorBuilder()) ->useExtension(new CoreExtension()) ->build(); } diff --git a/tests/Benchmark/HydratorWithCryptographyBench.php b/tests/Benchmark/HydratorWithCryptographyBench.php index 8e443335..1b93a77a 100644 --- a/tests/Benchmark/HydratorWithCryptographyBench.php +++ b/tests/Benchmark/HydratorWithCryptographyBench.php @@ -9,7 +9,7 @@ use Patchlevel\Hydrator\Extension\Cryptography\CryptographyExtension; use Patchlevel\Hydrator\Extension\Cryptography\Store\InMemoryCipherKeyStore; use Patchlevel\Hydrator\Hydrator; -use Patchlevel\Hydrator\HydratorBuilder; +use Patchlevel\Hydrator\StackHydratorBuilder; use Patchlevel\Hydrator\Tests\Benchmark\Fixture\ProfileCreated; use Patchlevel\Hydrator\Tests\Benchmark\Fixture\ProfileId; use Patchlevel\Hydrator\Tests\Benchmark\Fixture\Skill; @@ -26,7 +26,7 @@ public function __construct() { $this->store = new InMemoryCipherKeyStore(); - $this->hydrator = (new HydratorBuilder()) + $this->hydrator = (new StackHydratorBuilder()) ->useExtension(new CoreExtension()) ->useExtension(new CryptographyExtension(BaseCryptographer::createWithOpenssl($this->store))) ->build(); diff --git a/tests/Benchmark/HydratorWithLazyBench.php b/tests/Benchmark/HydratorWithLazyBench.php index de2b6885..a85224b7 100644 --- a/tests/Benchmark/HydratorWithLazyBench.php +++ b/tests/Benchmark/HydratorWithLazyBench.php @@ -6,7 +6,7 @@ use Patchlevel\Hydrator\CoreExtension; use Patchlevel\Hydrator\Hydrator; -use Patchlevel\Hydrator\HydratorBuilder; +use Patchlevel\Hydrator\StackHydratorBuilder; use Patchlevel\Hydrator\Tests\Benchmark\Fixture\ProfileCreated; use PhpBench\Attributes as Bench; @@ -17,7 +17,7 @@ final class HydratorWithLazyBench public function __construct() { - $this->hydrator = (new HydratorBuilder()) + $this->hydrator = (new StackHydratorBuilder()) ->useExtension(new CoreExtension()) ->enableDefaultLazy() ->build(); diff --git a/tests/Unit/Extension/Lifecycle/LifecycleExtensionTest.php b/tests/Unit/Extension/Lifecycle/LifecycleExtensionTest.php index 2d60a05f..4a0cb8a7 100644 --- a/tests/Unit/Extension/Lifecycle/LifecycleExtensionTest.php +++ b/tests/Unit/Extension/Lifecycle/LifecycleExtensionTest.php @@ -6,7 +6,7 @@ use Patchlevel\Hydrator\CoreExtension; use Patchlevel\Hydrator\Extension\Lifecycle\LifecycleExtension; -use Patchlevel\Hydrator\HydratorBuilder; +use Patchlevel\Hydrator\StackHydratorBuilder; use Patchlevel\Hydrator\Tests\Unit\Fixture\LifecycleFixture; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\TestCase; @@ -16,7 +16,7 @@ final class LifecycleExtensionTest extends TestCase { public function testIntegration(): void { - $hydrator = (new HydratorBuilder()) + $hydrator = (new StackHydratorBuilder()) ->useExtension(new CoreExtension()) ->useExtension(new LifecycleExtension()) ->build(); diff --git a/tests/Unit/HydratorBuilderTest.php b/tests/Unit/StackHydratorBuilderTest.php similarity index 78% rename from tests/Unit/HydratorBuilderTest.php rename to tests/Unit/StackHydratorBuilderTest.php index 16563049..774a86dd 100644 --- a/tests/Unit/HydratorBuilderTest.php +++ b/tests/Unit/StackHydratorBuilderTest.php @@ -7,42 +7,35 @@ use Patchlevel\Hydrator\Extension; use Patchlevel\Hydrator\Guesser\ChainGuesser; use Patchlevel\Hydrator\Guesser\Guesser; -use Patchlevel\Hydrator\HydratorBuilder; use Patchlevel\Hydrator\Metadata\AttributeMetadataFactory; use Patchlevel\Hydrator\Metadata\EnrichingMetadataFactory; use Patchlevel\Hydrator\Metadata\MetadataEnricher; use Patchlevel\Hydrator\Metadata\Psr16MetadataFactory; use Patchlevel\Hydrator\Metadata\Psr6MetadataFactory; -use Patchlevel\Hydrator\MetadataHydrator; use Patchlevel\Hydrator\Middleware\Middleware; +use Patchlevel\Hydrator\StackHydrator; +use Patchlevel\Hydrator\StackHydratorBuilder; use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\TestCase; use Psr\Cache\CacheItemPoolInterface; use Psr\SimpleCache\CacheInterface; use ReflectionProperty; -#[CoversClass(HydratorBuilder::class)] -final class HydratorBuilderTest extends TestCase +#[CoversClass(StackHydratorBuilder::class)] +final class StackHydratorBuilderTest extends TestCase { - public function testBuild(): void - { - $hydrator = (new HydratorBuilder())->build(); - - self::assertInstanceOf(MetadataHydrator::class, $hydrator); - } - public function testAddMiddlewareWithPriority(): void { $middleware1 = $this->createMock(Middleware::class); $middleware2 = $this->createMock(Middleware::class); - $builder = new HydratorBuilder(); + $builder = new StackHydratorBuilder(); $builder->addMiddleware($middleware1, 10); $builder->addMiddleware($middleware2, 20); $hydrator = $builder->build(); - $reflection = new ReflectionProperty(MetadataHydrator::class, 'middlewares'); + $reflection = new ReflectionProperty(StackHydrator::class, 'middlewares'); $middlewares = $reflection->getValue($hydrator); self::assertSame([$middleware2, $middleware1], $middlewares); @@ -53,13 +46,13 @@ public function testAddMetadataEnricherWithPriority(): void $enricher1 = $this->createMock(MetadataEnricher::class); $enricher2 = $this->createMock(MetadataEnricher::class); - $builder = new HydratorBuilder(); + $builder = new StackHydratorBuilder(); $builder->addMetadataEnricher($enricher1, 10); $builder->addMetadataEnricher($enricher2, 20); $hydrator = $builder->build(); - $reflection = new ReflectionProperty(MetadataHydrator::class, 'metadataFactory'); + $reflection = new ReflectionProperty(StackHydrator::class, 'metadataFactory'); $enrichingMetadataFactory = $reflection->getValue($hydrator); self::assertInstanceOf(EnrichingMetadataFactory::class, $enrichingMetadataFactory); @@ -75,13 +68,13 @@ public function testAddGuesserWithPriority(): void $guesser1 = $this->createMock(Guesser::class); $guesser2 = $this->createMock(Guesser::class); - $builder = new HydratorBuilder(); + $builder = new StackHydratorBuilder(); $builder->addGuesser($guesser1, 10); $builder->addGuesser($guesser2, 20); $hydrator = $builder->build(); - $reflection = new ReflectionProperty(MetadataHydrator::class, 'metadataFactory'); + $reflection = new ReflectionProperty(StackHydrator::class, 'metadataFactory'); $enrichingMetadataFactory = $reflection->getValue($hydrator); self::assertInstanceOf(EnrichingMetadataFactory::class, $enrichingMetadataFactory); @@ -104,19 +97,19 @@ public function testAddGuesserWithPriority(): void public function testEnableDefaultLazy(): void { - $builder = new HydratorBuilder(); + $builder = new StackHydratorBuilder(); $builder->enableDefaultLazy(); $hydrator = $builder->build(); - $reflection = new ReflectionProperty(MetadataHydrator::class, 'defaultLazy'); + $reflection = new ReflectionProperty(StackHydrator::class, 'defaultLazy'); self::assertTrue($reflection->getValue($hydrator)); } public function testUseExtension(): void { $extension = $this->createMock(Extension::class); - $builder = new HydratorBuilder(); + $builder = new StackHydratorBuilder(); $extension->expects(self::once()) ->method('configure') @@ -129,12 +122,12 @@ public function testCachePsr6(): void { $cache = $this->createMock(CacheItemPoolInterface::class); - $builder = new HydratorBuilder(); + $builder = new StackHydratorBuilder(); $builder->setCache($cache); $hydrator = $builder->build(); - $reflection = new ReflectionProperty(MetadataHydrator::class, 'metadataFactory'); + $reflection = new ReflectionProperty(StackHydrator::class, 'metadataFactory'); $factory = $reflection->getValue($hydrator); self::assertInstanceOf(Psr6MetadataFactory::class, $factory); @@ -144,12 +137,12 @@ public function testCachePsr16(): void { $cache = $this->createMock(CacheInterface::class); - $builder = new HydratorBuilder(); + $builder = new StackHydratorBuilder(); $builder->setCache($cache); $hydrator = $builder->build(); - $reflection = new ReflectionProperty(MetadataHydrator::class, 'metadataFactory'); + $reflection = new ReflectionProperty(StackHydrator::class, 'metadataFactory'); $factory = $reflection->getValue($hydrator); self::assertInstanceOf(Psr16MetadataFactory::class, $factory); diff --git a/tests/Unit/MetadataHydratorTest.php b/tests/Unit/StackHydratorTest.php similarity index 98% rename from tests/Unit/MetadataHydratorTest.php rename to tests/Unit/StackHydratorTest.php index 16d72890..22fa1838 100644 --- a/tests/Unit/MetadataHydratorTest.php +++ b/tests/Unit/StackHydratorTest.php @@ -12,14 +12,14 @@ use Patchlevel\Hydrator\ClassNotSupported; use Patchlevel\Hydrator\CoreExtension; use Patchlevel\Hydrator\DenormalizationFailure; -use Patchlevel\Hydrator\HydratorBuilder; use Patchlevel\Hydrator\Metadata\ClassMetadata; -use Patchlevel\Hydrator\MetadataHydrator; use Patchlevel\Hydrator\Middleware\Middleware; use Patchlevel\Hydrator\Middleware\Stack; use Patchlevel\Hydrator\Middleware\TransformMiddleware; use Patchlevel\Hydrator\NormalizationFailure; use Patchlevel\Hydrator\Normalizer\HydratorAwareNormalizer; +use Patchlevel\Hydrator\StackHydrator; +use Patchlevel\Hydrator\StackHydratorBuilder; use Patchlevel\Hydrator\Tests\Unit\Fixture\Circle1Dto; use Patchlevel\Hydrator\Tests\Unit\Fixture\Circle2Dto; use Patchlevel\Hydrator\Tests\Unit\Fixture\Circle3Dto; @@ -48,15 +48,15 @@ use ReflectionClass; use ReflectionProperty; -#[CoversClass(MetadataHydrator::class)] +#[CoversClass(StackHydrator::class)] #[CoversClass(TransformMiddleware::class)] -final class MetadataHydratorTest extends TestCase +final class StackHydratorTest extends TestCase { - private MetadataHydrator $hydrator; + private StackHydrator $hydrator; public function setUp(): void { - $this->hydrator = new MetadataHydrator(); + $this->hydrator = new StackHydrator(); } public function testExtract(): void @@ -167,7 +167,7 @@ public function testExtractWithContext(): void $this->isInstanceOf(Stack::class), )->willReturn($expect); - $hydrator = (new HydratorBuilder()) + $hydrator = (new StackHydratorBuilder()) ->useExtension(new CoreExtension()) ->addMiddleware($middleware) ->build(); @@ -322,7 +322,7 @@ public function testHydrateWithContext(): void $this->isInstanceOf(Stack::class), )->willReturn($expect); - $hydrator = (new HydratorBuilder()) + $hydrator = (new StackHydratorBuilder()) ->useExtension(new CoreExtension()) ->addMiddleware($middleware) ->build();