Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
262 changes: 128 additions & 134 deletions psalm-baseline.xml
Original file line number Diff line number Diff line change
@@ -1,137 +1,131 @@
<?xml version="1.0" encoding="UTF-8"?>
<files psalm-version="6.12.1@e71404b0465be25cf7f8a631b298c01c5ddd864f">
<file src="src/CreatedAt.php">
<PropertyNotSetInConstructor>
<code><![CDATA[CreatedAt]]></code>
</PropertyNotSetInConstructor>
</file>
<file src="src/Dispatcher/ListenerProvider.php">
<DocblockTypeContradiction>
<code><![CDATA[!\is_array($event)]]></code>
</DocblockTypeContradiction>
<MixedArgument>
<code><![CDATA[$arguments]]></code>
<code><![CDATA[$definition]]></code>
<code><![CDATA[$definition[self::DEFINITION_CLASS]]]></code>
<code><![CDATA[$role]]></code>
</MixedArgument>
<MixedArrayAccess>
<code><![CDATA[$definition[self::DEFINITION_CLASS]]]></code>
</MixedArrayAccess>
<MixedAssignment>
<code><![CDATA[$arguments]]></code>
<code><![CDATA[$role]]></code>
</MixedAssignment>
<RedundantConditionGivenDocblockType>
<code><![CDATA[\assert($listen instanceof Listen)]]></code>
</RedundantConditionGivenDocblockType>
</file>
<file src="src/Event/Mapper/Command/OnCreate.php">
<PropertyNotSetInConstructor>
<code><![CDATA[OnCreate]]></code>
</PropertyNotSetInConstructor>
</file>
<file src="src/Event/Mapper/Command/OnDelete.php">
<PropertyNotSetInConstructor>
<code><![CDATA[OnDelete]]></code>
</PropertyNotSetInConstructor>
</file>
<file src="src/Event/Mapper/Command/OnUpdate.php">
<PropertyNotSetInConstructor>
<code><![CDATA[OnUpdate]]></code>
</PropertyNotSetInConstructor>
</file>
<file src="src/EventDrivenCommandGenerator.php">
<MixedReturnStatement>
<code><![CDATA[$event->command]]></code>
<code><![CDATA[$event->command]]></code>
<code><![CDATA[$event->command]]></code>
</MixedReturnStatement>
<PropertyNotSetInConstructor>
<code><![CDATA[$timestamp]]></code>
</PropertyNotSetInConstructor>
</file>
<file src="src/EventListener.php">
<MixedArrayAssignment>
<code><![CDATA[$schema[SchemaInterface::LISTENERS][]]]></code>
</MixedArrayAssignment>
<PropertyNotSetInConstructor>
<code><![CDATA[$role]]></code>
</PropertyNotSetInConstructor>
</file>
<file src="src/Exception/OptimisticLock/ChangedVersionException.php">
<ClassMustBeFinal>
<code><![CDATA[ChangedVersionException]]></code>
</ClassMustBeFinal>
<MixedArgument>
<code><![CDATA[$new]]></code>
<code><![CDATA[$old]]></code>
</MixedArgument>
</file>
<file src="src/Exception/OptimisticLock/RecordIsLockedException.php">
<ClassMustBeFinal>
<code><![CDATA[RecordIsLockedException]]></code>
</ClassMustBeFinal>
</file>
<file src="src/Hook.php">
<PropertyNotSetInConstructor>
<code><![CDATA[Hook]]></code>
</PropertyNotSetInConstructor>
</file>
<file src="src/Listener/OptimisticLock.php">
<MixedAssignment>
<code><![CDATA[$nodeValue]]></code>
<code><![CDATA[$stateValue]]></code>
</MixedAssignment>
</file>
<file src="src/OptimisticLock.php">
<PropertyNotSetInConstructor>
<code><![CDATA[OptimisticLock]]></code>
</PropertyNotSetInConstructor>
</file>
<file src="src/Schema/BaseModifier.php">
<MixedArrayAssignment>
<code><![CDATA[$schema[SchemaInterface::LISTENERS][]]]></code>
<code><![CDATA[$schema[SchemaInterface::LISTENERS][]]]></code>
</MixedArrayAssignment>
</file>
<file src="src/Schema/RegistryModifier.php">
<ArgumentTypeCoercion>
<code><![CDATA[$columnName]]></code>
<code><![CDATA[$columnName]]></code>
<code><![CDATA[$columnName]]></code>
<code><![CDATA[$columnName]]></code>
<code><![CDATA[$columnName]]></code>
<code><![CDATA[$columnName]]></code>
<code><![CDATA[$columnName]]></code>
<code><![CDATA[$columnName]]></code>
<code><![CDATA[$columnName]]></code>
<code><![CDATA[$columnName]]></code>
<code><![CDATA[$columnName]]></code>
<code><![CDATA[$columnName]]></code>
<code><![CDATA[$columnName]]></code>
<code><![CDATA[$columnName]]></code>
<code><![CDATA[$columnName]]></code>
<code><![CDATA[$columnName]]></code>
<code><![CDATA[$columnName]]></code>
<code><![CDATA[$columnName]]></code>
<code><![CDATA[$rule]]></code>
</ArgumentTypeCoercion>
<ClassMustBeFinal>
<code><![CDATA[RegistryModifier]]></code>
</ClassMustBeFinal>
<MixedAssignment>
<code><![CDATA[$defaultHandlers]]></code>
</MixedAssignment>
</file>
<file src="src/SoftDelete.php">
<PropertyNotSetInConstructor>
<code><![CDATA[SoftDelete]]></code>
</PropertyNotSetInConstructor>
</file>
<file src="src/UpdatedAt.php">
<PropertyNotSetInConstructor>
<code><![CDATA[UpdatedAt]]></code>
</PropertyNotSetInConstructor>
</file>
<file src="src/CreatedAt.php">
<PropertyNotSetInConstructor>
<code><![CDATA[CreatedAt]]></code>
</PropertyNotSetInConstructor>
</file>
<file src="src/Dispatcher/ListenerProvider.php">
<DocblockTypeContradiction>
<code><![CDATA[!\is_array($event)]]></code>
</DocblockTypeContradiction>
<MixedArgument>
<code><![CDATA[$arguments]]></code>
<code><![CDATA[$definition]]></code>
<code><![CDATA[$definition[self::DEFINITION_CLASS]]]></code>
<code><![CDATA[$role]]></code>
</MixedArgument>
<MixedArrayAccess>
<code><![CDATA[$definition[self::DEFINITION_CLASS]]]></code>
</MixedArrayAccess>
<MixedAssignment>
<code><![CDATA[$arguments]]></code>
<code><![CDATA[$role]]></code>
</MixedAssignment>
<RedundantConditionGivenDocblockType>
<code><![CDATA[\assert($listen instanceof Listen)]]></code>
</RedundantConditionGivenDocblockType>
</file>
<file src="src/Event/Mapper/Command/OnCreate.php">
<PropertyNotSetInConstructor>
<code><![CDATA[OnCreate]]></code>
</PropertyNotSetInConstructor>
</file>
<file src="src/Event/Mapper/Command/OnDelete.php">
<PropertyNotSetInConstructor>
<code><![CDATA[OnDelete]]></code>
</PropertyNotSetInConstructor>
</file>
<file src="src/Event/Mapper/Command/OnUpdate.php">
<PropertyNotSetInConstructor>
<code><![CDATA[OnUpdate]]></code>
</PropertyNotSetInConstructor>
</file>
<file src="src/EventDrivenCommandGenerator.php">
<MixedReturnStatement>
<code><![CDATA[$event->command]]></code>
<code><![CDATA[$event->command]]></code>
<code><![CDATA[$event->command]]></code>
</MixedReturnStatement>
<PropertyNotSetInConstructor>
<code><![CDATA[$timestamp]]></code>
</PropertyNotSetInConstructor>
</file>
<file src="src/EventListener.php">
<MixedArrayAssignment>
<code><![CDATA[$schema[SchemaInterface::LISTENERS][]]]></code>
</MixedArrayAssignment>
<PropertyNotSetInConstructor>
<code><![CDATA[$role]]></code>
</PropertyNotSetInConstructor>
</file>
<file src="src/Exception/OptimisticLock/ChangedVersionException.php">
<ClassMustBeFinal>
<code><![CDATA[ChangedVersionException]]></code>
</ClassMustBeFinal>
<MixedArgument>
<code><![CDATA[$new]]></code>
<code><![CDATA[$old]]></code>
</MixedArgument>
</file>
<file src="src/Exception/OptimisticLock/RecordIsLockedException.php">
<ClassMustBeFinal>
<code><![CDATA[RecordIsLockedException]]></code>
</ClassMustBeFinal>
</file>
<file src="src/Hook.php">
<PropertyNotSetInConstructor>
<code><![CDATA[Hook]]></code>
</PropertyNotSetInConstructor>
</file>
<file src="src/Listener/OptimisticLock.php">
<MixedAssignment>
<code><![CDATA[$nodeValue]]></code>
<code><![CDATA[$stateValue]]></code>
</MixedAssignment>
</file>
<file src="src/OptimisticLock.php">
<PropertyNotSetInConstructor>
<code><![CDATA[OptimisticLock]]></code>
</PropertyNotSetInConstructor>
</file>
<file src="src/Schema/BaseModifier.php">
<MixedArrayAssignment>
<code><![CDATA[$schema[SchemaInterface::LISTENERS][]]]></code>
<code><![CDATA[$schema[SchemaInterface::LISTENERS][]]]></code>
</MixedArrayAssignment>
</file>
<file src="src/Schema/RegistryModifier.php">
<ArgumentTypeCoercion>
<code><![CDATA[$columnName]]></code>
<code><![CDATA[$columnName]]></code>
<code><![CDATA[$columnName]]></code>
<code><![CDATA[$columnName]]></code>
<code><![CDATA[$columnName]]></code>
<code><![CDATA[$columnName]]></code>
<code><![CDATA[$columnName]]></code>
<code><![CDATA[$columnName]]></code>
<code><![CDATA[$columnName]]></code>
<code><![CDATA[$columnName]]></code>
<code><![CDATA[$columnName]]></code>
<code><![CDATA[$columnName]]></code>
<code><![CDATA[$rule]]></code>
</ArgumentTypeCoercion>
<ClassMustBeFinal>
<code><![CDATA[RegistryModifier]]></code>
</ClassMustBeFinal>
<MixedAssignment>
<code><![CDATA[$defaultHandlers]]></code>
</MixedAssignment>
</file>
<file src="src/SoftDelete.php">
<PropertyNotSetInConstructor>
<code><![CDATA[SoftDelete]]></code>
</PropertyNotSetInConstructor>
</file>
<file src="src/UpdatedAt.php">
<PropertyNotSetInConstructor>
<code><![CDATA[UpdatedAt]]></code>
</PropertyNotSetInConstructor>
</file>
</files>
34 changes: 34 additions & 0 deletions src/Schema/RegistryModifier.php
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ class RegistryModifier
protected const STRING_COLUMN = AbstractColumn::STRING;
protected const BIG_INTEGER_COLUMN = 'bigInteger';
protected const DATETIME_COLUMN = 'datetime';
protected const SNOWFLAKE_COLUMN = 'snowflake';
protected const ULID_COLUMN = 'ulid';
protected const UUID_COLUMN = 'uuid';

Expand Down Expand Up @@ -85,6 +86,13 @@ public static function isStringType(string $type): bool
return $matches['type'] === 'string';
}

public static function isSnowflakeType(string $type): bool
{
\preg_match(self::DEFINITION, $type, $matches);

return $matches['type'] === self::SNOWFLAKE_COLUMN;
}

public static function isUlidType(string $type): bool
{
\preg_match(self::DEFINITION, $type, $matches);
Expand Down Expand Up @@ -188,6 +196,31 @@ public function addStringColumn(string $columnName, string $fieldName, int|null
}

/**
* @param non-empty-string $columnName
* @throws BehaviorCompilationException
*/
public function addSnowflakeColumn(string $columnName, string $fieldName, int|null $generated = null): AbstractColumn
{
if ($this->fields->has($fieldName)) {
if (!static::isSnowflakeType($this->fields->get($fieldName)->getType())) {
throw new BehaviorCompilationException(
\sprintf('Field %s must be of type %s.', $fieldName, self::SNOWFLAKE_COLUMN),
);
}
$this->validateColumnName($fieldName, $columnName);
$this->fields->get($fieldName)->setGenerated($generated);

return $this->table->column($columnName);
}

$field = (new Field())->setColumn($columnName)->setType(self::SNOWFLAKE_COLUMN)->setGenerated($generated);
$this->fields->set($fieldName, $field);

return $this->table->column($columnName)->type(self::SNOWFLAKE_COLUMN);
}

/**
* @param non-empty-string $columnName
* @throws BehaviorCompilationException
*/
public function addUlidColumn(string $columnName, string $fieldName, int|null $generated = null): AbstractColumn
Expand All @@ -211,6 +244,7 @@ public function addUlidColumn(string $columnName, string $fieldName, int|null $g
}

/**
* @param non-empty-string $columnName
* @throws BehaviorCompilationException
*/
public function addUuidColumn(string $columnName, string $fieldName, int|null $generated = null): AbstractColumn
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,28 @@ public function testAddBigIntegerFieldThrowsException(): void
$this->modifier->addBigIntegerColumn('snowflake_column', 'snowflake');
}

public function testAddSnowflakeField(): void
{
$this->modifier->addSnowflakeColumn('snowflake_column', 'snowflake');

$entity = $this->registry->getEntity(self::ROLE_TEST);
$fields = $entity->getFields();

$this->assertTrue($fields->has('snowflake'));
$this->assertSame('snowflake', $fields->get('snowflake')->getType());
$this->assertSame('snowflake_column', $fields->get('snowflake')->getColumn());
}

public function testAddSnowflakeFieldThrowsException(): void
{
$this->modifier->addStringColumn('snowflake_column', 'snowflake');

$this->expectException(BehaviorCompilationException::class);
$this->expectExceptionMessage('Field snowflake must be of type snowflake.');

$this->modifier->addSnowflakeColumn('snowflake_column', 'snowflake');
}

public function testAddUlidField(): void
{
$this->modifier->addUlidColumn('ulid_column', 'ulid');
Expand Down
16 changes: 16 additions & 0 deletions tests/Behavior/Unit/Schema/RegistryModifierTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,22 @@ public function testIsStringTypeFalse(mixed $type): void
$this->assertFalse(RegistryModifier::isStringType($type));
}

public function testIsSnowflakeTypeTrue(): void
{
$this->assertTrue(RegistryModifier::isSnowflakeType('snowflake'));
}

/**
* @dataProvider integerDataProvider
* @dataProvider datetimeDataProvider
* @dataProvider invalidDataProvider
* @dataProvider stringDataProvider
*/
public function testIsSnowflakeTypeFalse(mixed $type): void
{
$this->assertFalse(RegistryModifier::isSnowflakeType($type));
}

public function testIsUlidTypeTrue(): void
{
$this->assertTrue(RegistryModifier::isUlidType('ulid'));
Expand Down
Loading