From f8fc5cc8263473c896737505eebbe0cca628d1ea Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Wed, 26 Nov 2025 00:04:42 +0300 Subject: [PATCH 1/5] Refactor `ColumnDefinitionParser` --- CHANGELOG.md | 1 + src/Column/ColumnDefinitionParser.php | 40 ++++++++++++++++++- tests/ColumnDefinitionParserTest.php | 26 ++++++++++++ .../ColumnDefinitionParserProvider.php | 18 +++++++++ 4 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 tests/ColumnDefinitionParserTest.php create mode 100644 tests/Provider/ColumnDefinitionParserProvider.php diff --git a/CHANGELOG.md b/CHANGELOG.md index f8da79f5..2805e75b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -55,6 +55,7 @@ - Chg #428: Update expression namespaces according to changes in `yiisoft/db` package (@Tigrov) - Enh #432, #433: Update `DMLQueryBuilder::update()` method to adapt changes in `yiisoft/db` (@rustamwin, @Tigrov) - Enh #439: Move "Packets out of order" warning suppression from Yii DB (@vjik) +- Chg #447: Refactor `ColumnDefinitionParser` (@vjik) ## 1.2.0 March 21, 2024 diff --git a/src/Column/ColumnDefinitionParser.php b/src/Column/ColumnDefinitionParser.php index 53206921..c6a93ce2 100644 --- a/src/Column/ColumnDefinitionParser.php +++ b/src/Column/ColumnDefinitionParser.php @@ -4,6 +4,8 @@ namespace Yiisoft\Db\Mysql\Column; +use Yiisoft\Db\Syntax\AbstractColumnDefinitionParser; + /** * Parses column definition string. For example, `string(255)` or `int unsigned`. * @@ -19,7 +21,7 @@ * unsigned?: bool * } */ -final class ColumnDefinitionParser extends \Yiisoft\Db\Syntax\ColumnDefinitionParser +final class ColumnDefinitionParser extends AbstractColumnDefinitionParser { /** * @psalm-return ExtraInfo @@ -44,4 +46,40 @@ protected function extraInfo(string $extra): array return $info; } + + protected function parseTypeParams(string $type, string $params): array + { + return match ($type) { + 'bit', + 'bigint', + 'binary', + 'char', + 'decimal', + 'double', + 'float', + 'int', + 'integer', + 'mediumint', + 'numeric', + 'real', + 'smallint', + 'string', + 'tinyint', + 'varbinary', + 'varchar', + 'year' => $this->parseSizeInfo($params), + 'enum' => $this->parseEnumValues($params), + default => [], + }; + } + + /** + * @psalm-return array{enumValues: list} + */ + protected function parseEnumValues(string $params): array + { + preg_match_all("/'([^']*)'/", $params, $matches); + + return ['enumValues' => $matches[1]]; + } } diff --git a/tests/ColumnDefinitionParserTest.php b/tests/ColumnDefinitionParserTest.php new file mode 100644 index 00000000..df04a879 --- /dev/null +++ b/tests/ColumnDefinitionParserTest.php @@ -0,0 +1,26 @@ + 'enum', 'enumValues' => ['a', 'b', 'c']]], + ["enum('a','b','c') NOT NULL", ['type' => 'enum', 'enumValues' => ['a', 'b', 'c'], 'notNull' => true]], + ]; + } +} + From c5c85d5e85fa5e5157667f6a0830dd0f182ce7e7 Mon Sep 17 00:00:00 2001 From: vjik <525501+vjik@users.noreply.github.com> Date: Tue, 25 Nov 2025 21:13:06 +0000 Subject: [PATCH 2/5] Apply PHP CS Fixer and Rector changes (CI) --- tests/Provider/ColumnDefinitionParserProvider.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/Provider/ColumnDefinitionParserProvider.php b/tests/Provider/ColumnDefinitionParserProvider.php index 2612cf94..71db388a 100644 --- a/tests/Provider/ColumnDefinitionParserProvider.php +++ b/tests/Provider/ColumnDefinitionParserProvider.php @@ -15,4 +15,3 @@ public static function parse(): array ]; } } - From b8d8d0b7e6c413f2bb730b4225e80b6d2d42259c Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Wed, 26 Nov 2025 00:26:14 +0300 Subject: [PATCH 3/5] fix --- .github/workflows/mutation.yml | 2 +- src/Column/ColumnDefinitionParser.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/mutation.yml b/.github/workflows/mutation.yml index 7c723ba1..c65d1c14 100644 --- a/.github/workflows/mutation.yml +++ b/.github/workflows/mutation.yml @@ -70,6 +70,6 @@ jobs: - name: Run infection. run: | - vendor/bin/roave-infection-static-analysis-plugin --threads=2 --ignore-msi-with-no-mutations --only-covered + vendor/bin/roave-infection-static-analysis-plugin --threads=2 --ignore-msi-with-no-mutations env: STRYKER_DASHBOARD_API_KEY: ${{ secrets.STRYKER_DASHBOARD_API_KEY }} diff --git a/src/Column/ColumnDefinitionParser.php b/src/Column/ColumnDefinitionParser.php index c6a93ce2..24d4a712 100644 --- a/src/Column/ColumnDefinitionParser.php +++ b/src/Column/ColumnDefinitionParser.php @@ -24,8 +24,8 @@ final class ColumnDefinitionParser extends AbstractColumnDefinitionParser { /** - * @psalm-return ExtraInfo - * @psalm-suppress ImplementedReturnTypeMismatch, InvalidReturnType, InvalidReturnStatement + * @inheritDoc + * @psalm-suppress InvalidReturnType, InvalidReturnStatement */ protected function extraInfo(string $extra): array { From 1affaf72bbde71b3324631d4023140236eb62ff4 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Wed, 26 Nov 2025 00:32:21 +0300 Subject: [PATCH 4/5] Update tests/ColumnDefinitionParserTest.php Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- tests/ColumnDefinitionParserTest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/ColumnDefinitionParserTest.php b/tests/ColumnDefinitionParserTest.php index df04a879..c82717e0 100644 --- a/tests/ColumnDefinitionParserTest.php +++ b/tests/ColumnDefinitionParserTest.php @@ -2,6 +2,7 @@ declare(strict_types=1); +namespace Yiisoft\Db\Mysql\Tests; use PHPUnit\Framework\Attributes\DataProviderExternal; use Yiisoft\Db\Mysql\Column\ColumnDefinitionParser; use Yiisoft\Db\Mysql\Tests\Provider\ColumnDefinitionParserProvider; From 6c2459e8562b9ad8d9c8c608c5818a7a5f13bca0 Mon Sep 17 00:00:00 2001 From: vjik <525501+vjik@users.noreply.github.com> Date: Tue, 25 Nov 2025 21:33:33 +0000 Subject: [PATCH 5/5] Apply PHP CS Fixer and Rector changes (CI) --- tests/ColumnDefinitionParserTest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/ColumnDefinitionParserTest.php b/tests/ColumnDefinitionParserTest.php index c82717e0..4b4f0076 100644 --- a/tests/ColumnDefinitionParserTest.php +++ b/tests/ColumnDefinitionParserTest.php @@ -3,6 +3,7 @@ declare(strict_types=1); namespace Yiisoft\Db\Mysql\Tests; + use PHPUnit\Framework\Attributes\DataProviderExternal; use Yiisoft\Db\Mysql\Column\ColumnDefinitionParser; use Yiisoft\Db\Mysql\Tests\Provider\ColumnDefinitionParserProvider;