Skip to content

Commit 576bef9

Browse files
committed
extract migrations flattening in collector and add test
1 parent f9054b0 commit 576bef9

File tree

4 files changed

+243
-50
lines changed

4 files changed

+243
-50
lines changed

Collector/MigrationsCollector.php

Lines changed: 8 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,6 @@
55
namespace Doctrine\Bundle\MigrationsBundle\Collector;
66

77
use Doctrine\Migrations\DependencyFactory;
8-
use Doctrine\Migrations\Metadata\AvailableMigration;
9-
use Doctrine\Migrations\Metadata\AvailableMigrationsList;
10-
use Doctrine\Migrations\Metadata\ExecutedMigration;
11-
use Doctrine\Migrations\Metadata\ExecutedMigrationsList;
128
use Doctrine\Migrations\Metadata\Storage\TableMetadataStorageConfiguration;
139
use Symfony\Component\HttpFoundation\Request;
1410
use Symfony\Component\HttpFoundation\Response;
@@ -18,10 +14,13 @@ class MigrationsCollector extends DataCollector
1814
{
1915
/** @var DependencyFactory */
2016
private $dependencyFactory;
17+
/** @var MigrationsFlattener */
18+
private $flattener;
2119

22-
public function __construct(DependencyFactory $dependencyFactory)
20+
public function __construct(DependencyFactory $dependencyFactory, MigrationsFlattener $migrationsFlattener)
2321
{
2422
$this->dependencyFactory = $dependencyFactory;
23+
$this->flattener = $migrationsFlattener;
2524
}
2625

2726
public function collect(Request $request, Response $response, \Throwable $exception = null)
@@ -33,11 +32,11 @@ public function collect(Request $request, Response $response, \Throwable $except
3332
$executedMigrations = $metadataStorage->getExecutedMigrations();
3433
$availableMigrations = $planCalculator->getMigrations();
3534

36-
$this->data['available_migrations'] = $this->flattenAvailableMigrations($availableMigrations, $executedMigrations);
37-
$this->data['executed_migrations'] = $this->flattenExecutedMigrations($executedMigrations, $availableMigrations);
35+
$this->data['available_migrations'] = $this->flattener->flattenAvailableMigrations($availableMigrations, $executedMigrations);
36+
$this->data['executed_migrations'] = $this->flattener->flattenExecutedMigrations($executedMigrations, $availableMigrations);
3837

39-
$this->data['new_migrations'] = $this->flattenAvailableMigrations($statusCalculator->getNewMigrations());
40-
$this->data['unavailable_migrations'] = $this->flattenExecutedMigrations($statusCalculator->getExecutedUnavailableMigrations());
38+
$this->data['new_migrations'] = $this->flattener->flattenAvailableMigrations($statusCalculator->getNewMigrations());
39+
$this->data['unavailable_migrations'] = $this->flattener->flattenExecutedMigrations($statusCalculator->getExecutedUnavailableMigrations());
4140

4241
$this->data['storage'] = get_class($metadataStorage);
4342
$configuration = $this->dependencyFactory->getConfiguration();
@@ -68,43 +67,4 @@ public function reset()
6867
{
6968
$this->data = [];
7069
}
71-
72-
private function flattenAvailableMigrations(AvailableMigrationsList $migrationsList, ?ExecutedMigrationsList $executedMigrations = null): array
73-
{
74-
return array_map(static function (AvailableMigration $migration) use ($executedMigrations) {
75-
$executedMigration = $executedMigrations && $executedMigrations->hasMigration($migration->getVersion())
76-
? $executedMigrations->getMigration($migration->getVersion())
77-
: null;
78-
79-
return [
80-
'version' => (string)$migration->getVersion(),
81-
'is_new' => !$executedMigration,
82-
'is_unavailable' => false,
83-
'description' => $migration->getMigration()->getDescription(),
84-
'executed_at' => $executedMigration ? $executedMigration->getExecutedAt() : null,
85-
'execution_time' => $executedMigration ? $executedMigration->getExecutionTime() : null,
86-
'file' => (new \ReflectionClass($migration->getMigration()))->getFileName(),
87-
];
88-
}, $migrationsList->getItems());
89-
}
90-
91-
private function flattenExecutedMigrations(ExecutedMigrationsList $migrationsList, ?AvailableMigrationsList $availableMigrations = null): array
92-
{
93-
return array_map(static function (ExecutedMigration $migration) use ($availableMigrations) {
94-
95-
$availableMigration = $availableMigrations && $availableMigrations->hasMigration($migration->getVersion())
96-
? $availableMigrations->getMigration($migration->getVersion())->getMigration()
97-
: null;
98-
99-
return [
100-
'version' => (string)$migration->getVersion(),
101-
'is_new' => false,
102-
'is_unavailable' => !$availableMigration,
103-
'description' => $availableMigration ? $availableMigration->getDescription() : null,
104-
'executed_at' => $migration->getExecutedAt(),
105-
'execution_time' => $migration->getExecutionTime(),
106-
'file' => $availableMigration ? (new \ReflectionClass($availableMigration))->getFileName() : null,
107-
];
108-
}, $migrationsList->getItems());
109-
}
11070
}

Collector/MigrationsFlattener.php

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Doctrine\Bundle\MigrationsBundle\Collector;
6+
7+
use Doctrine\Migrations\Metadata\AvailableMigration;
8+
use Doctrine\Migrations\Metadata\AvailableMigrationsList;
9+
use Doctrine\Migrations\Metadata\ExecutedMigration;
10+
use Doctrine\Migrations\Metadata\ExecutedMigrationsList;
11+
12+
class MigrationsFlattener
13+
{
14+
public function flattenAvailableMigrations(AvailableMigrationsList $migrationsList, ?ExecutedMigrationsList $executedMigrations = null): array
15+
{
16+
return array_map(static function (AvailableMigration $migration) use ($executedMigrations) {
17+
$executedMigration = $executedMigrations && $executedMigrations->hasMigration($migration->getVersion())
18+
? $executedMigrations->getMigration($migration->getVersion())
19+
: null;
20+
21+
return [
22+
'version' => (string)$migration->getVersion(),
23+
'is_new' => !$executedMigration,
24+
'is_unavailable' => false,
25+
'description' => $migration->getMigration()->getDescription(),
26+
'executed_at' => $executedMigration ? $executedMigration->getExecutedAt() : null,
27+
'execution_time' => $executedMigration ? $executedMigration->getExecutionTime() : null,
28+
'file' => (new \ReflectionClass($migration->getMigration()))->getFileName(),
29+
];
30+
}, $migrationsList->getItems());
31+
}
32+
33+
public function flattenExecutedMigrations(ExecutedMigrationsList $migrationsList, ?AvailableMigrationsList $availableMigrations = null): array
34+
{
35+
return array_map(static function (ExecutedMigration $migration) use ($availableMigrations) {
36+
37+
$availableMigration = $availableMigrations && $availableMigrations->hasMigration($migration->getVersion())
38+
? $availableMigrations->getMigration($migration->getVersion())->getMigration()
39+
: null;
40+
41+
return [
42+
'version' => (string)$migration->getVersion(),
43+
'is_new' => false,
44+
'is_unavailable' => !$availableMigration,
45+
'description' => $availableMigration ? $availableMigration->getDescription() : null,
46+
'executed_at' => $migration->getExecutedAt(),
47+
'execution_time' => $migration->getExecutionTime(),
48+
'file' => $availableMigration ? (new \ReflectionClass($availableMigration))->getFileName() : null,
49+
];
50+
}, $migrationsList->getItems());
51+
}
52+
}

DependencyInjection/DoctrineMigrationsExtension.php

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Doctrine\Bundle\MigrationsBundle\DependencyInjection;
66

77
use Doctrine\Bundle\MigrationsBundle\Collector\MigrationsCollector;
8+
use Doctrine\Bundle\MigrationsBundle\Collector\MigrationsFlattener;
89
use Doctrine\Migrations\Metadata\Storage\MetadataStorage;
910
use Doctrine\Migrations\Metadata\Storage\TableMetadataStorageConfiguration;
1011
use Doctrine\Migrations\Version\MigrationFactory;
@@ -162,9 +163,14 @@ private function getBundlePath(string $bundleName, ContainerBuilder $container):
162163

163164
private function registerCollector(ContainerBuilder $container): void
164165
{
165-
$collectorDefinition = new Definition(MigrationsCollector::class);
166+
$flattenerDefinition = new Definition(MigrationsFlattener::class);
167+
$container->setDefinition('doctrine_migrations.migrations_flattener', $flattenerDefinition);
168+
169+
$collectorDefinition = new Definition(MigrationsCollector::class, [
170+
new Reference('doctrine.migrations.dependency_factory'),
171+
new Reference('doctrine_migrations.migrations_flattener'),
172+
]);
166173
$collectorDefinition
167-
->addArgument(new Reference('doctrine.migrations.dependency_factory'))
168174
->addTag('data_collector', [
169175
'template' => '@DoctrineMigrations/Collector/migrations.html.twig',
170176
'id' => 'doctrine_migrations',
Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Doctrine\Bundle\MigrationsBundle\Tests\Collector;
6+
7+
use DateTimeImmutable;
8+
use Doctrine\Bundle\MigrationsBundle\Collector\MigrationsFlattener;
9+
use Doctrine\Bundle\MigrationsBundle\Tests\Fixtures\Migrations\Migration001;
10+
use Doctrine\DBAL\Connection;
11+
use Doctrine\Migrations\Metadata\AvailableMigration;
12+
use Doctrine\Migrations\Metadata\AvailableMigrationsList;
13+
use Doctrine\Migrations\Metadata\ExecutedMigration;
14+
use Doctrine\Migrations\Metadata\ExecutedMigrationsList;
15+
use Doctrine\Migrations\Version\Version;
16+
use PHPUnit\Framework\TestCase;
17+
use Psr\Log\NullLogger;
18+
19+
use function dirname;
20+
21+
class MigrationsFlattenerTest extends TestCase
22+
{
23+
/** @var MigrationsFlattener */
24+
private $flattener;
25+
26+
protected function setUp(): void
27+
{
28+
$this->flattener = new MigrationsFlattener();
29+
}
30+
31+
public function testFlattenAvailableMigrationsWithoutExecutedMigrations(): void
32+
{
33+
$expected = [
34+
[
35+
'version' => '012345',
36+
'is_new' => true,
37+
'is_unavailable' => false,
38+
'description' => '',
39+
'executed_at' => null,
40+
'execution_time' => null,
41+
'file' => dirname(__DIR__) . '/Fixtures/Migrations/Migration001.php',
42+
],
43+
[
44+
'version' => '123456',
45+
'is_new' => true,
46+
'is_unavailable' => false,
47+
'description' => '',
48+
'executed_at' => null,
49+
'execution_time' => null,
50+
'file' => dirname(__DIR__) . '/Fixtures/Migrations/Migration001.php',
51+
],
52+
[
53+
'version' => '456789',
54+
'is_new' => true,
55+
'is_unavailable' => false,
56+
'description' => '',
57+
'executed_at' => null,
58+
'execution_time' => null,
59+
'file' => dirname(__DIR__) . '/Fixtures/Migrations/Migration001.php',
60+
],
61+
];
62+
63+
$actual = $this->flattener->flattenAvailableMigrations($this->createAvailableMigrations());
64+
self::assertSame($expected, $actual);
65+
}
66+
67+
public function testFlattenAvailableMigrationsWithExecutedMigrations(): void
68+
{
69+
$expected = [
70+
[
71+
'version' => '012345',
72+
'is_new' => false,
73+
'is_unavailable' => false,
74+
'description' => '',
75+
'executed_at' => new DateTimeImmutable('2020-12-12 20:15:00'),
76+
'execution_time' => 3.2,
77+
'file' => dirname(__DIR__) . '/Fixtures/Migrations/Migration001.php',
78+
],
79+
[
80+
'version' => '123456',
81+
'is_new' => true,
82+
'is_unavailable' => false,
83+
'description' => '',
84+
'executed_at' => null,
85+
'execution_time' => null,
86+
'file' => dirname(__DIR__) . '/Fixtures/Migrations/Migration001.php',
87+
],
88+
[
89+
'version' => '456789',
90+
'is_new' => true,
91+
'is_unavailable' => false,
92+
'description' => '',
93+
'executed_at' => null,
94+
'execution_time' => null,
95+
'file' => dirname(__DIR__) . '/Fixtures/Migrations/Migration001.php',
96+
],
97+
];
98+
99+
$actual = $this->flattener->flattenAvailableMigrations($this->createAvailableMigrations(), $this->createExecutedMigrations());
100+
self::assertEquals($expected, $actual);
101+
}
102+
103+
public function testFlattenExecutedMigrationsWithoutAvailableMigrations(): void
104+
{
105+
$expected = [
106+
[
107+
'version' => '012345',
108+
'is_new' => false,
109+
'is_unavailable' => true,
110+
'description' => '',
111+
'executed_at' => new DateTimeImmutable('2020-12-12 20:15:00'),
112+
'execution_time' => 3.2,
113+
'file' => null,
114+
],
115+
[
116+
'version' => '111111',
117+
'is_new' => false,
118+
'is_unavailable' => true,
119+
'description' => '',
120+
'executed_at' => new DateTimeImmutable('2020-12-14 20:30:00'),
121+
'execution_time' => 8.9,
122+
'file' => null,
123+
],
124+
];
125+
126+
$actual = $this->flattener->flattenExecutedMigrations($this->createExecutedMigrations());
127+
self::assertEquals($expected, $actual);
128+
}
129+
130+
public function testFlattenExecutedMigrationsWithAvailableMigrations(): void
131+
{
132+
$expected = [
133+
[
134+
'version' => '012345',
135+
'is_new' => false,
136+
'is_unavailable' => false,
137+
'description' => '',
138+
'executed_at' => new DateTimeImmutable('2020-12-12 20:15:00'),
139+
'execution_time' => 3.2,
140+
'file' => dirname(__DIR__) . '/Fixtures/Migrations/Migration001.php',
141+
],
142+
[
143+
'version' => '111111',
144+
'is_new' => false,
145+
'is_unavailable' => true,
146+
'description' => '',
147+
'executed_at' => new DateTimeImmutable('2020-12-14 20:30:00'),
148+
'execution_time' => 8.9,
149+
'file' => null,
150+
],
151+
];
152+
153+
$actual = $this->flattener->flattenExecutedMigrations($this->createExecutedMigrations(), $this->createAvailableMigrations());
154+
self::assertEquals($expected, $actual);
155+
}
156+
157+
private function createAvailableMigrations(): AvailableMigrationsList
158+
{
159+
$migration = new Migration001($this->createMock(Connection::class), new NullLogger());
160+
161+
return new AvailableMigrationsList([
162+
new AvailableMigration(new Version('012345'), $migration),
163+
new AvailableMigration(new Version('123456'), $migration),
164+
new AvailableMigration(new Version('456789'), $migration),
165+
]);
166+
}
167+
168+
private function createExecutedMigrations(): ExecutedMigrationsList
169+
{
170+
return new ExecutedMigrationsList([
171+
new ExecutedMigration(new Version('012345'), new DateTimeImmutable('2020-12-12 20:15:00'), 3.2),
172+
new ExecutedMigration(new Version('111111'), new DateTimeImmutable('2020-12-14 20:30:00'), 8.9),
173+
]);
174+
}
175+
}

0 commit comments

Comments
 (0)