Skip to content

Commit

Permalink
Create an attribute driver decoupled from the annotations driver, dep…
Browse files Browse the repository at this point in the history
…recate the annotation based attribute reader
  • Loading branch information
mbabker committed Jan 29, 2023
1 parent d159c8e commit 9264c9c
Show file tree
Hide file tree
Showing 6 changed files with 135 additions and 27 deletions.
49 changes: 49 additions & 0 deletions src/Metadata/Driver/AnnotationDriver.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<?php

declare(strict_types=1);

namespace JMS\Serializer\Metadata\Driver;

use Doctrine\Common\Annotations\Reader;
use JMS\Serializer\Expression\CompilableExpressionEvaluatorInterface;
use JMS\Serializer\Naming\PropertyNamingStrategyInterface;
use JMS\Serializer\Type\ParserInterface;

class AnnotationDriver extends AnnotationOrAttributeDriver
{
/**
* @var Reader
*/
private $reader;

public function __construct(Reader $reader, PropertyNamingStrategyInterface $namingStrategy, ?ParserInterface $typeParser = null, ?CompilableExpressionEvaluatorInterface $expressionEvaluator = null)
{
parent::__construct($namingStrategy, $typeParser, $expressionEvaluator);

$this->reader = $reader;
}

/**
* @return list<object>
*/
protected function getClassAnnotations(\ReflectionClass $class): array
{
return $this->reader->getClassAnnotations($class);
}

/**
* @return list<object>
*/
protected function getMethodAnnotations(\ReflectionMethod $method): array
{
return $this->reader->getMethodAnnotations($method);
}

/**
* @return list<object>
*/
protected function getPropertyAnnotations(\ReflectionProperty $property): array
{
return $this->reader->getPropertyAnnotations($property);
}
}
47 changes: 47 additions & 0 deletions src/Metadata/Driver/AttributeDriver.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<?php

declare(strict_types=1);

namespace JMS\Serializer\Metadata\Driver;

class AttributeDriver extends AnnotationOrAttributeDriver
{
/**
* @return list<object>
*/
protected function getClassAnnotations(\ReflectionClass $class): array
{
return array_map(
static function (\ReflectionAttribute $attribute): object {
return $attribute->newInstance();
},
$class->getAttributes()
);
}

/**
* @return list<object>
*/
protected function getMethodAnnotations(\ReflectionMethod $method): array
{
return array_map(
static function (\ReflectionAttribute $attribute): object {
return $attribute->newInstance();
},
$method->getAttributes()
);
}

/**
* @return list<object>
*/
protected function getPropertyAnnotations(\ReflectionProperty $property): array
{
return array_map(
static function (\ReflectionAttribute $attribute): object {
return $attribute->newInstance();
},
$property->getAttributes()
);
}
}
4 changes: 4 additions & 0 deletions src/Metadata/Driver/AttributeDriver/AttributeReader.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,14 @@
namespace JMS\Serializer\Metadata\Driver\AttributeDriver;

use Doctrine\Common\Annotations\Reader;
use JMS\Serializer\Metadata\Driver\AttributeDriver;
use ReflectionClass;
use ReflectionMethod;
use ReflectionProperty;

/**
* @deprecated use {@see AttributeDriver} instead
*/
class AttributeReader implements Reader
{
/**
Expand Down
22 changes: 1 addition & 21 deletions tests/Metadata/Driver/AnnotationDriverTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,32 +7,12 @@
use Doctrine\Common\Annotations\AnnotationReader;
use JMS\Serializer\Metadata\Driver\AnnotationDriver;
use JMS\Serializer\Naming\IdenticalPropertyNamingStrategy;
use JMS\Serializer\Tests\Fixtures\AllExcludedObject;
use Metadata\Driver\DriverInterface;

class AnnotationDriverTest extends BaseDriverTest
class AnnotationDriverTest extends BaseAnnotationOrAttributeDriverTest
{
public function testAllExcluded()
{
$a = new AllExcludedObject();
$m = $this->getDriver()->loadMetadataForClass(new \ReflectionClass($a));

self::assertArrayNotHasKey('foo', $m->propertyMetadata);
self::assertArrayHasKey('bar', $m->propertyMetadata);
}

protected function getDriver(?string $subDir = null, bool $addUnderscoreDir = true): DriverInterface
{
return new AnnotationDriver(new AnnotationReader(), new IdenticalPropertyNamingStrategy(), null, $this->getExpressionEvaluator());
}

public function testCanDefineMetadataForInternalClass()
{
$this->markTestSkipped('Can not define annotation metadata for internal classes');
}

public function testShortExposeSyntax(): void
{
$this->markTestSkipped('Short expose syntax not supported on annotations');
}
}
8 changes: 2 additions & 6 deletions tests/Metadata/Driver/AttributeDriverTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,11 @@

namespace JMS\Serializer\Tests\Metadata\Driver;

use Doctrine\Common\Annotations\AnnotationReader;
use JMS\Serializer\Metadata\Driver\AnnotationDriver;
use JMS\Serializer\Metadata\Driver\AttributeDriver;
use JMS\Serializer\Naming\IdenticalPropertyNamingStrategy;
use Metadata\Driver\DriverInterface;

class AttributeDriverTest extends AnnotationDriverTest
class AttributeDriverTest extends BaseAnnotationOrAttributeDriverTest
{
protected function setUp(): void
{
Expand All @@ -23,8 +21,6 @@ protected function setUp(): void

protected function getDriver(?string $subDir = null, bool $addUnderscoreDir = true): DriverInterface
{
$annotationsReader = new AttributeDriver\AttributeReader(new AnnotationReader());

return new AnnotationDriver($annotationsReader, new IdenticalPropertyNamingStrategy(), null, $this->getExpressionEvaluator());
return new AttributeDriver(new IdenticalPropertyNamingStrategy(), null, $this->getExpressionEvaluator());
}
}
32 changes: 32 additions & 0 deletions tests/Metadata/Driver/BaseAnnotationOrAttributeDriverTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

declare(strict_types=1);

namespace JMS\Serializer\Tests\Metadata\Driver;

use JMS\Serializer\Tests\Fixtures\AllExcludedObject;
use Metadata\Driver\DriverInterface;

abstract class BaseAnnotationOrAttributeDriverTest extends BaseDriverTest
{
abstract protected function getDriver(?string $subDir = null, bool $addUnderscoreDir = true): DriverInterface;

public function testAllExcluded(): void
{
$a = new AllExcludedObject();
$m = $this->getDriver()->loadMetadataForClass(new \ReflectionClass($a));

self::assertArrayNotHasKey('foo', $m->propertyMetadata);
self::assertArrayHasKey('bar', $m->propertyMetadata);
}

public function testCanDefineMetadataForInternalClass(): void
{
$this->markTestSkipped('Can not define annotation or attribute metadata for internal classes');
}

public function testShortExposeSyntax(): void
{
$this->markTestSkipped('Short expose syntax not supported on annotations or attribute');
}
}

0 comments on commit 9264c9c

Please sign in to comment.