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(

0 commit comments

Comments
 (0)