Skip to content

Commit 45bb6d8

Browse files
committed
Migrate to php 8.4 and get rid of laminas-file
1 parent 14d8fda commit 45bb6d8

17 files changed

+132
-75
lines changed

composer.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616
"compositephp/db": "^0.4.0",
1717
"nette/php-generator": "^4.0",
1818
"symfony/console": "2 - 6",
19-
"laminas/laminas-file": "^2.12",
20-
"doctrine/inflector": "^2.0"
19+
"doctrine/inflector": "^2.0",
20+
"nikic/php-parser": "^5.3"
2121
},
2222
"require-dev": {
2323
"phpunit/phpunit": "^10.1",

phpunit.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.1/phpunit.xsd" bootstrap="tests/bootstrap.php"
44
executionOrder="depends,defects" beStrictAboutOutputDuringTests="true" failOnRisky="true" failOnWarning="true"
55
colors="true" cacheDirectory=".phpunit.cache" requireCoverageMetadata="false"
6+
displayDetailsOnTestsThatTriggerDeprecations="true"
7+
displayDetailsOnTestsThatTriggerErrors="true"
8+
displayDetailsOnTestsThatTriggerNotices="true"
9+
displayDetailsOnPhpunitDeprecations="true"
10+
displayDetailsOnTestsThatTriggerWarnings="true"
611
beStrictAboutCoverageMetadata="true">
712
<testsuites>
813
<testsuite name="default">

src/Commands/MigrateCommand.php

Lines changed: 18 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@
55
use Composer\Autoload\ClassLoader;
66
use Composite\DB\Attributes\Table;
77
use Composite\Sync\Attributes\SkipMigration;
8+
use Composite\Sync\Helpers\ClassFileLocator;
89
use Composite\Sync\Helpers\ConsoleLogger;
910
use Composite\Sync\Migration\MigrationsManager;
1011
use Composite\Sync\Helpers\CommandHelper;
1112
use Composite\DB\TableConfig;
1213
use Composite\Entity\AbstractEntity;
1314
use Composite\Entity\Exceptions\EntityException;
14-
use Laminas\File\ClassFileLocator;
1515
use Symfony\Component\Console\Attribute\AsCommand;
1616
use Symfony\Component\Console\Command\Command;
1717
use Symfony\Component\Console\Input\InputInterface;
@@ -108,29 +108,24 @@ private function findAllEntities(): array
108108
}
109109

110110
foreach ($dirs as $dir) {
111-
$locator = new ClassFileLocator($dir);
112-
foreach ($locator as $file) {
113-
foreach ($file->getClasses() as $class) {
114-
if (!is_subclass_of($class, AbstractEntity::class)) {
115-
continue;
116-
}
117-
$schema = $class::schema();
118-
if ($schema->getFirstAttributeByClass(SkipMigration::class)) {
119-
continue;
120-
}
121-
if (!$schema->getFirstAttributeByClass(Table::class)) {
122-
continue;
123-
}
124-
try {
125-
$tableConfig = TableConfig::fromEntitySchema($schema);
126-
} catch (EntityException) {
127-
continue;
128-
}
129-
if ($onlyConnectionName && $tableConfig->connectionName !== $onlyConnectionName) {
130-
continue;
131-
}
132-
$result[] = $class;
111+
$locator = new ClassFileLocator();
112+
foreach ($locator->findClasses($dir, AbstractEntity::class) as $class) {
113+
$schema = $class::schema();
114+
if ($schema->getFirstAttributeByClass(SkipMigration::class)) {
115+
continue;
116+
}
117+
if (!$schema->getFirstAttributeByClass(Table::class)) {
118+
continue;
119+
}
120+
try {
121+
$tableConfig = TableConfig::fromEntitySchema($schema);
122+
} catch (EntityException) {
123+
continue;
124+
}
125+
if ($onlyConnectionName && $tableConfig->connectionName !== $onlyConnectionName) {
126+
continue;
133127
}
128+
$result[] = $class;
134129
}
135130
}
136131
return $result;

src/Helpers/ClassFileLocator.php

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace Composite\Sync\Helpers;
4+
5+
use PhpParser\Error;
6+
use PhpParser\Node;
7+
use PhpParser\Node\Name\FullyQualified;
8+
use PhpParser\NodeTraverser;
9+
use PhpParser\NodeVisitor\NameResolver;
10+
use PhpParser\NodeVisitorAbstract;
11+
use PhpParser\ParserFactory;
12+
13+
class ClassFileLocator extends NodeVisitorAbstract
14+
{
15+
/** @var array<class-string> */
16+
private array $classes;
17+
18+
/** @var class-string */
19+
private string $parentClass;
20+
21+
public function enterNode(Node $node): void
22+
{
23+
if ($node instanceof Node\Stmt\Class_) {
24+
if (!$node->namespacedName) {
25+
return;
26+
}
27+
if ($this->getParentClassName($node) !== $this->parentClass) {
28+
return;
29+
}
30+
$this->classes[] = $node->namespacedName->toString();
31+
}
32+
}
33+
34+
/**
35+
* @template T
36+
* @param class-string<T> $parentClass
37+
* @return array<class-string<T>>
38+
*/
39+
public function findClasses(string $directory, string $parentClass): array
40+
{
41+
$this->parentClass = $parentClass;
42+
$this->classes = [];
43+
44+
$parser = (new ParserFactory)->createForHostVersion();
45+
$traverser = new NodeTraverser();
46+
47+
$traverser->addVisitor(new NameResolver());
48+
$traverser->addVisitor($this);
49+
50+
$rii = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($directory));
51+
foreach ($rii as $file) {
52+
if (!$file->isDir() && pathinfo($file->getFilename(), PATHINFO_EXTENSION) === 'php') {
53+
$code = file_get_contents($file->getPathname());
54+
55+
try {
56+
$stmts = $parser->parse($code);
57+
if ($stmts !== null) {
58+
$traverser->traverse($stmts);
59+
}
60+
} catch (Error) {}
61+
}
62+
}
63+
return $this->classes;
64+
}
65+
66+
private function getParentClassName(Node\Stmt\Class_ $classNode): ?string
67+
{
68+
if (!$extendsNode = $classNode->extends) {
69+
return null;
70+
}
71+
if (!$extendsNode instanceof FullyQualified) {
72+
return null;
73+
}
74+
return $extendsNode->toString();
75+
}
76+
}

tests/Generator/CachedTableClassBuilderTest.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,11 @@
55
use Composite\Sync\Generator\CachedTableClassBuilder;
66
use Composite\Sync\Tests\TestStand\Entities\TestAutoincrementEntity;
77
use Composite\Sync\Tests\TestStand\Entities\TestCompositeEntity;
8+
use PHPUnit\Framework\Attributes\DataProvider;
89

910
final class CachedTableClassBuilderTest extends \PHPUnit\Framework\TestCase
1011
{
11-
/**
12-
* @dataProvider classBuilder_dataProvider
13-
*/
12+
#[DataProvider('classBuilder_dataProvider')]
1413
public function test_getFileContent(string $tableClassName, string $entityClassName, $expectedOutput)
1514
{
1615
$classBuilder = new CachedTableClassBuilder(

tests/Generator/EnumClassBuilderTest.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,11 @@
33
namespace Composite\Sync\Tests\Generator;
44

55
use Composite\Sync\Generator\EnumClassBuilder;
6+
use PHPUnit\Framework\Attributes\DataProvider;
67

78
final class EnumClassBuilderTest extends \PHPUnit\Framework\TestCase
89
{
9-
/**
10-
* @dataProvider enumClassBuilder_dataProvider
11-
*/
10+
#[DataProvider('enumClassBuilder_dataProvider')]
1211
public function test_getFileContent($enumClassName, $cases, $expectedOutput)
1312
{
1413
$enumClassBuilder = new EnumClassBuilder($enumClassName, $cases);

tests/Generator/MySQLEntityClassBuilderTest.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,11 @@
55
use Composite\Sync\Generator\EntityClassBuilder;
66
use Composite\Sync\Generator\EnumClassBuilder;
77
use Composite\Sync\Providers\MySQL\MySQLParser;
8+
use PHPUnit\Framework\Attributes\DataProvider;
89

910
final class MySQLEntityClassBuilderTest extends \PHPUnit\Framework\TestCase
1011
{
11-
/**
12-
* @dataProvider sql_dataProvider
13-
*/
12+
#[DataProvider('sql_dataProvider')]
1413
public function test_generate(
1514
string $tableName,
1615
string $sqlQuery,

tests/Generator/PostgresEntityClassBuilderTest.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,14 @@
66
use Composite\Sync\Generator\EntityClassBuilder;
77
use Composite\Sync\Generator\EnumClassBuilder;
88
use Composite\Sync\Providers\PostgreSQL\PgSQLParser;
9+
use PHPUnit\Framework\Attributes\DataProvider;
910

1011
final class PostgresEntityClassBuilderTest extends \PHPUnit\Framework\TestCase
1112
{
1213
const CONNECTION_NAME = 'postgres';
1314
const TABLE_NAME = 'test_table';
1415

15-
/**
16-
* @dataProvider sql_dataProvider
17-
*/
16+
#[DataProvider('sql_dataProvider')]
1817
public function test_generate(
1918
array $initQueries,
2019
string $entityClass,

tests/Generator/SQLiteEntityClassBuilderTest.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,14 @@
66
use Composite\Sync\Generator\EntityClassBuilder;
77
use Composite\Sync\Generator\EnumClassBuilder;
88
use Composite\Sync\Providers\SQLite\SQLiteParser;
9+
use PHPUnit\Framework\Attributes\DataProvider;
910

1011
final class SQLiteEntityClassBuilderTest extends \PHPUnit\Framework\TestCase
1112
{
1213
const CONNECTION_NAME = 'sqlite';
1314
const TABLE_NAME = 'test_table';
1415

15-
/**
16-
* @dataProvider sql_dataProvider
17-
*/
16+
#[DataProvider('sql_dataProvider')]
1817
public function test_generate(
1918
array $initQueries,
2019
string $entityClass,

tests/Generator/TableClassBuilderTest.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,11 @@
55
use Composite\Sync\Generator\TableClassBuilder;
66
use Composite\Sync\Tests\TestStand\Entities\TestAutoincrementEntity;
77
use Composite\Sync\Tests\TestStand\Entities\TestCompositeEntity;
8+
use PHPUnit\Framework\Attributes\DataProvider;
89

910
final class TableClassBuilderTest extends \PHPUnit\Framework\TestCase
1011
{
11-
/**
12-
* @dataProvider classBuilder_dataProvider
13-
*/
12+
#[DataProvider('classBuilder_dataProvider')]
1413
public function test_getFileContent(string $tableClassName, string $entityClassName, $expectedOutput)
1514
{
1615
$classBuilder = new TableClassBuilder(

tests/Helpers/ClassHelperTest.php

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,12 @@
33
namespace Composite\Sync\Tests\Helpers;
44

55
use Composite\Sync\Helpers\ClassHelper;
6+
use PHPUnit\Framework\Attributes\DataProvider;
67
use PHPUnit\Framework\TestCase;
78

89
class ClassHelperTest extends TestCase
910
{
10-
/**
11-
* @dataProvider extractNamespace_dataProvider
12-
*/
11+
#[DataProvider('extractNamespace_dataProvider')]
1312
public function test_extractNamespace(string $name, string $expected): void
1413
{
1514
$result = ClassHelper::extractNamespace($name);
@@ -25,9 +24,7 @@ public static function extractNamespace_dataProvider(): array
2524
];
2625
}
2726

28-
/**
29-
* @dataProvider extractShortName_dataProvider
30-
*/
27+
#[DataProvider('extractShortName_dataProvider')]
3128
public function test_extractShortName(string $name, string $expected): void
3229
{
3330
$result = ClassHelper::extractShortName($name);
@@ -43,9 +40,7 @@ public static function extractShortName_dataProvider(): array
4340
];
4441
}
4542

46-
/**
47-
* @dataProvider normalizeString_dataProvider
48-
*/
43+
#[DataProvider('normalizeString_dataProvider')]
4944
public function test_normalizeString(string $input, string $expected): void
5045
{
5146
$result = ClassHelper::normalizeString($input);

tests/Migration/MigrationClassBuilderTest.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,11 @@
33
namespace Composite\Sync\Tests\Migration;
44

55
use Composite\Sync\Migration\MigrationClassBuilder;
6+
use PHPUnit\Framework\Attributes\DataProvider;
67

78
final class MigrationClassBuilderTest extends \PHPUnit\Framework\TestCase
89
{
9-
/**
10-
* @dataProvider migrationName_dataProvider
11-
*/
10+
#[DataProvider('migrationName_dataProvider')]
1211
public function test_buildMigrationName(string $connectionName, array $summaryParts, array $upQueries, array $downQueries, string $expectedResult)
1312
{
1413
$builder = new MigrationClassBuilder(

tests/Migration/MigrationManagerTest.php

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,11 @@
1111
use Composite\Sync\Tests\TestStand\Entities\TestMigrationEntityV2;
1212
use Composite\Sync\Tests\TestStand\Tables\TestMySQLTable;
1313
use Doctrine\DBAL\Exception\TableNotFoundException;
14+
use PHPUnit\Framework\Attributes\DataProvider;
1415

1516
final class MigrationManagerTest extends \PHPUnit\Framework\TestCase
1617
{
17-
/**
18-
* @dataProvider migrationName_dataProvider
19-
*/
18+
#[DataProvider('migrationName_dataProvider')]
2019
public function test_buildMigrationName(string $connectionName, array $summaryParts, string $expectedResult)
2120
{
2221
$migrationName = MigrationsManager::buildMigrationName($connectionName, $summaryParts);
@@ -58,9 +57,7 @@ public static function flow_dataProvider(): array
5857
];
5958
}
6059

61-
/**
62-
* @dataProvider flow_dataProvider
63-
*/
60+
#[DataProvider('flow_dataProvider')]
6461
public function test_flow(string $connectionName): void
6562
{
6663
$this->cleanVersionTable($connectionName);

tests/Providers/MySQL/MySQLColumnTest.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22

33
namespace Composite\Sync\Tests\Providers\MySQL;
44

5+
use Composite\Sync\Helpers\SQLParser;
56
use Composite\Sync\Providers\MySQL\MySQLColumn;
67
use Composite\Sync\Providers\MySQL\MySQLColumnType;
7-
use iamcal\SQLParser;
8+
use PHPUnit\Framework\Attributes\DataProvider;
89

910
final class MySQLColumnTest extends \PHPUnit\Framework\TestCase
1011
{
@@ -610,9 +611,7 @@ public static function sqlColumn_DataProvider(): array
610611
];
611612
}
612613

613-
/**
614-
* @dataProvider sqlColumn_DataProvider
615-
*/
614+
#[DataProvider('sqlColumn_DataProvider')]
616615
public function test_parseSQLColumn(string $sql, MySQLColumn $expected): void
617616
{
618617
$tableSQL = "CREATE TABLE Test ($sql)";

tests/Providers/MySQL/MySQLComparatorTest.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use Composite\DB\Traits\SoftDelete;
66
use Composite\DB\Traits\UpdatedAt;
77
use Composite\Sync\Attributes\SkipMigration;
8+
use PHPUnit\Framework\Attributes\DataProvider;
89
use Composite\DB\Attributes\{PrimaryKey, Table};
910
use Composite\Sync\Providers\MySQL\MySQLComparator;
1011
use Composite\Sync\Providers\MySQL\MySQLIndex;
@@ -608,9 +609,7 @@ public function __construct(
608609
];
609610
}
610611

611-
/**
612-
* @dataProvider run_dataProvider
613-
*/
612+
#[DataProvider('run_dataProvider')]
614613
public function test_run(
615614
AbstractEntity $entity,
616615
?string $sql,

0 commit comments

Comments
 (0)