Skip to content

Commit e53ca69

Browse files
committed
no issue - move anonymizer metadata responsability into AnonymizerRegistry
1 parent 391ee40 commit e53ca69

File tree

6 files changed

+75
-48
lines changed

6 files changed

+75
-48
lines changed

phpstan.neon.dist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@ parameters:
88
checkMissingOverrideMethodAttribute: true
99
ignoreErrors:
1010
- '#Instantiated class Seld\\PharUtils\\Timestamps not found.#'
11-
- '#on an unknown class Seld\\PharUtils\\Timestamps.#'
11+
- '#on an unknown class Seld\\PharUtils\\Timestamps.#'

src/Anonymization/Anonymizator.php

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -86,14 +86,11 @@ protected function getSalt(): string
8686
*/
8787
protected function createAnonymizer(AnonymizerConfig $config): AbstractAnonymizer
8888
{
89-
$className = $this->anonymizerRegistry->get($config->anonymizer);
90-
\assert(\is_subclass_of($className, AbstractAnonymizer::class));
91-
92-
return new $className(
93-
$config->table,
94-
$config->targetName,
95-
$this->databaseSession,
89+
return $this->anonymizerRegistry->createAnonymizer(
90+
$config->anonymizer,
91+
$config,
9692
$config->options->with(['salt' => $this->getSalt()]),
93+
$this->databaseSession
9794
);
9895
}
9996

src/Anonymization/Anonymizer/AbstractAnonymizer.php

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
namespace MakinaCorpus\DbToolsBundle\Anonymization\Anonymizer;
66

77
use MakinaCorpus\DbToolsBundle\Anonymization\Anonymizator;
8-
use MakinaCorpus\DbToolsBundle\Attribute\AsAnonymizer;
98
use MakinaCorpus\QueryBuilder\DatabaseSession;
109
use MakinaCorpus\QueryBuilder\Expression;
1110
use MakinaCorpus\QueryBuilder\ExpressionFactory;
@@ -28,20 +27,6 @@ final public function __construct(
2827
$this->validateOptions();
2928
}
3029

31-
final public static function id(): string
32-
{
33-
return self::getMetadata()->id();
34-
}
35-
36-
final public static function getMetadata(): AsAnonymizer
37-
{
38-
if ($attributes = (new \ReflectionClass(static::class))->getAttributes(AsAnonymizer::class)) {
39-
return $attributes[0]->newInstance();
40-
}
41-
42-
throw new \LogicException(\sprintf("Class '%s' should have an '%s' attribute.", static::class, AsAnonymizer::class));
43-
}
44-
4530
/**
4631
* Get table name.
4732
*

src/Anonymization/Anonymizer/AnonymizerRegistry.php

Lines changed: 60 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
namespace MakinaCorpus\DbToolsBundle\Anonymization\Anonymizer;
66

77
use Composer\InstalledVersions;
8+
use MakinaCorpus\DbToolsBundle\Anonymization\Config\AnonymizerConfig;
9+
use MakinaCorpus\DbToolsBundle\Attribute\AsAnonymizer;
10+
use MakinaCorpus\QueryBuilder\DatabaseSession;
811

912
class AnonymizerRegistry
1013
{
@@ -26,7 +29,10 @@ class AnonymizerRegistry
2629
Core\StringAnonymizer::class,
2730
];
2831

29-
private ?array $anonymizers = null;
32+
/** @var array<string, string> */
33+
private ?array $classes = null;
34+
/** @var array<string, AsAnonymizer> */
35+
private ?array $metadata = null;
3036
private array $paths = [];
3137

3238
public function __construct(?array $paths = null)
@@ -45,42 +51,70 @@ public function addPath(array $paths): void
4551
/**
4652
* Get all registered anonymizers classe names.
4753
*
48-
* @return array<string,string>
49-
* Keys are names, values are class names.
54+
* @return array<string,AsAnonymizer>
5055
*/
51-
public function getAnonymizers(): array
56+
public function getAllAnonymizerMetadata(): array
5257
{
5358
$this->initialize();
5459

55-
return $this->anonymizers;
60+
return $this->metadata;
5661
}
5762

5863
/**
59-
* Get anonymizer class name.
60-
*
61-
* @param string $name
62-
* Anonymizer name.
63-
*
64-
* @return string
65-
* Anonymizer class name.
64+
* Create anonymizer instance.
65+
*/
66+
public function createAnonymizer(
67+
string $name,
68+
AnonymizerConfig $config,
69+
Options $options,
70+
DatabaseSession $databaseSession,
71+
): AbstractAnonymizer {
72+
$className = $this->getAnonymizerClass($name);
73+
74+
return new $className($config->table, $config->targetName, $databaseSession, $options);
75+
}
76+
77+
/**
78+
* Get anonymizer metadata.
79+
*/
80+
public function getAnonymizerMetadata(string $name): AsAnonymizer
81+
{
82+
$this->initialize();
83+
84+
return $this->metadata[$name] ?? $this->throwAnonymizerDoesNotExist($name);
85+
}
86+
87+
/**
88+
* @internal
89+
* For unit tests only, please do not use.
6690
*/
67-
public function get(string $name): string
91+
public function getAnonymizerClass(string $name): string
6892
{
6993
$this->initialize();
7094

71-
return $this->anonymizers[$name] ?? throw new \InvalidArgumentException(\sprintf("Can't find Anonymizer with name : %s, check your configuration.", $name));
95+
return $this->classes[$name] ?? $this->throwAnonymizerDoesNotExist($name);
96+
}
97+
98+
private function getAnonymizatorClassMetadata(string $className): AsAnonymizer
99+
{
100+
if ($attributes = (new \ReflectionClass($className))->getAttributes(AsAnonymizer::class)) {
101+
return $attributes[0]->newInstance();
102+
}
103+
104+
throw new \LogicException(\sprintf("Class '%s' should have an '%s' attribute.", $className, AsAnonymizer::class));
72105
}
73106

74107
/**
75108
* Lazy initialization.
76109
*/
77110
private function initialize(): void
78111
{
79-
if (null !== $this->anonymizers) {
112+
if (null !== $this->classes) {
80113
return;
81114
}
82115

83-
$this->anonymizers = [];
116+
$this->classes = [];
117+
$this->metadata = [];
84118

85119
foreach (self::$coreAnonymizers as $className) {
86120
$this->addAnonymizer($className, true);
@@ -152,7 +186,11 @@ private function addAnonymizer(string $className, bool $failOnError = false): vo
152186
return;
153187
}
154188

155-
$this->anonymizers[$className::id()] = $className;
189+
$metadata = $this->getAnonymizatorClassMetadata($className);
190+
$id = $metadata->id();
191+
192+
$this->classes[$id] = $className;
193+
$this->metadata[$id] = $metadata;
156194
}
157195

158196
/**
@@ -172,4 +210,9 @@ private function locatePacks(): void
172210
}
173211
}
174212
}
213+
214+
private function throwAnonymizerDoesNotExist(string $name): never
215+
{
216+
throw new \InvalidArgumentException(\sprintf("Can't find Anonymizer with name : %s, check your configuration.", $name));
217+
}
175218
}

src/Command/Anonymization/AnonymizerListCommand.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,10 @@ protected function execute(InputInterface $input, OutputInterface $output): int
3232

3333
$io = new SymfonyStyle($input, $output);
3434

35-
$rawList = $this->anonymizerRegistry->getAnonymizers();
35+
$rawList = $this->anonymizerRegistry->getAllAnonymizerMetadata();
3636

3737
$list = [];
38-
foreach ($rawList as $anonymizer) {
39-
$metadata = $anonymizer::getMetadata();
38+
foreach ($rawList as $metadata) {
4039
\assert($metadata instanceof AsAnonymizer);
4140

4241
if (!\array_key_exists($metadata->pack, $list)) {

tests/Unit/Anonymization/Anonymizer/AnonymizerRegistryTest.php

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,17 @@ public function testAnonymizerRegistryWithTestPack(): void
1717

1818
$anonymizerRegistry = new AnonymizerRegistry();
1919

20-
$anonymizers = $anonymizerRegistry->getAnonymizers();
20+
$anonymizers = $anonymizerRegistry->getAllAnonymizerMetadata();
2121

2222
self::assertNotEmpty($anonymizers);
2323
self::assertArrayHasKey('string', $anonymizers);
2424
self::assertArrayHasKey('test.my-anonymizer', $anonymizers);
2525

26-
self::assertEquals('MakinaCorpus\DbToolsBundle\Anonymization\Anonymizer\Core\FloatAnonymizer', $anonymizerRegistry->get('float'));
27-
self::assertEquals('DbToolsBundle\PackTest\Anonymizer\MyAnonymizer', $anonymizerRegistry->get('test.my-anonymizer'));
26+
self::assertEquals('MakinaCorpus\DbToolsBundle\Anonymization\Anonymizer\Core\FloatAnonymizer', $anonymizerRegistry->getAnonymizerClass('float'));
27+
self::assertEquals('float', $anonymizerRegistry->getAnonymizerMetadata('float')->id());
28+
29+
self::assertEquals('DbToolsBundle\PackTest\Anonymizer\MyAnonymizer', $anonymizerRegistry->getAnonymizerClass('test.my-anonymizer'));
30+
self::assertEquals('test.my-anonymizer', $anonymizerRegistry->getAnonymizerMetadata('test.my-anonymizer')->id());
2831
} finally {
2932
$this->composerProjectRemove();
3033
}
@@ -34,10 +37,10 @@ public function testAnonymizerRegistryWithoutTestPack(): void
3437
{
3538
$anonymizerRegistry = new AnonymizerRegistry();
3639

37-
self::assertEquals('MakinaCorpus\DbToolsBundle\Anonymization\Anonymizer\Core\FloatAnonymizer', $anonymizerRegistry->get('float'));
40+
self::assertEquals('MakinaCorpus\DbToolsBundle\Anonymization\Anonymizer\Core\FloatAnonymizer', $anonymizerRegistry->getAnonymizerClass('float'));
3841

3942
self::expectExceptionMessageMatches("@Can't find Anonymizer@");
40-
$anonymizerRegistry->get('test.my_anonymizer');
43+
$anonymizerRegistry->getAnonymizerClass('test.my_anonymizer');
4144
}
4245

4346
private function composerProjectRemove(): void

0 commit comments

Comments
 (0)