diff --git a/.travis.yml b/.travis.yml index bbaf530..209b70c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,6 +8,11 @@ matrix: - DEPENDENCIES="" - EXECUTE_CS_CHECK=true - TEST_COVERAGE=true + - php: 8.0 + env: + - DEPENDENCIES="" + - EXECUTE_CS_CHECK=true + - TEST_COVERAGE=true cache: directories: @@ -23,11 +28,11 @@ before_script: script: - if [[ $TEST_COVERAGE == 'true' ]]; then php -dzend_extension=xdebug.so ./vendor/bin/phpunit --coverage-text --coverage-clover ./build/logs/clover.xml; else ./vendor/bin/phpunit; fi -# - if [[ $EXECUTE_CS_CHECK == 'true' ]]; then ./vendor/bin/php-cs-fixer fix -v --diff --dry-run; fi -# - if [[ $EXECUTE_CS_CHECK == 'true' ]]; then ./vendor/bin/docheader check examples/ src/ tests/; fi + - if [[ $EXECUTE_CS_CHECK == 'true' ]]; then ./vendor/bin/php-cs-fixer fix src -v --diff --dry-run; fi + - if [[ $EXECUTE_CS_CHECK == 'true' ]]; then ./vendor/bin/docheader check examples/ src/ tests/; fi after_success: - - if [[ $TEST_COVERAGE == 'true' ]]; then php vendor/bin/coveralls -v; fi + - if [[ $TEST_COVERAGE == 'true' ]]; then php ./vendor/bin/php-coveralls -v; fi notifications: webhooks: diff --git a/composer.json b/composer.json index ee729b4..be3fa40 100644 --- a/composer.json +++ b/composer.json @@ -16,14 +16,14 @@ } ], "require": { - "php": "^7.4", - "roave/security-advisories": "dev-master" + "php": "^7.4 || ^8.0" }, "require-dev": { - "phpunit/phpunit": "^7.0", - "prooph/php-cs-fixer-config": "^0.3", - "satooshi/php-coveralls": "^2.2", - "malukenho/docheader": "^0.1.4" + "phpunit/phpunit": "^8.0 || ^9.0", + "prooph/php-cs-fixer-config": "^0.4", + "php-coveralls/php-coveralls": "^2.2", + "malukenho/docheader": "^0.1.4", + "roave/security-advisories": "dev-latest" }, "autoload": { "psr-4": { diff --git a/src/DataConverter.php b/src/DataConverter.php index 6b5c229..7ef87ba 100644 --- a/src/DataConverter.php +++ b/src/DataConverter.php @@ -1,7 +1,7 @@ + * (c) 2018-2021 prooph software GmbH * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. diff --git a/src/ImmutableRecord.php b/src/ImmutableRecord.php index 0abe53e..a705147 100644 --- a/src/ImmutableRecord.php +++ b/src/ImmutableRecord.php @@ -1,7 +1,7 @@ + * (c) 2018-2021 prooph software GmbH * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. diff --git a/src/ImmutableRecordDataConverter.php b/src/ImmutableRecordDataConverter.php index 73526aa..5029cde 100644 --- a/src/ImmutableRecordDataConverter.php +++ b/src/ImmutableRecordDataConverter.php @@ -1,7 +1,7 @@ + * (c) 2018-2021 prooph software GmbH * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. diff --git a/src/ImmutableRecordLogic.php b/src/ImmutableRecordLogic.php index 717647b..5516f05 100644 --- a/src/ImmutableRecordLogic.php +++ b/src/ImmutableRecordLogic.php @@ -1,7 +1,7 @@ + * (c) 2018-2021 prooph software GmbH * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. @@ -56,7 +56,7 @@ public static function fromArray(array $nativeData): self return new self(null, $nativeData); } - private function __construct(array $recordData = null, array $nativeData = null) + private function __construct(array|null $recordData = null, array|null $nativeData = null) { if (null === self::$__propTypeMap) { self::$__propTypeMap = self::buildPropTypeMap(); @@ -93,6 +93,12 @@ public function toArray(): array $arrayPropItemTypeMap = self::getArrayPropItemTypeMapFromMethodOrCache(); foreach (self::$__propTypeMap as $key => [$type, $isNative, $isNullable]) { + $specialKey = $key; + + if ($this instanceof SpecialKeySupport) { + $specialKey = $this->convertKeyForArray($key); + } + switch ($type) { case ImmutableRecord::PHP_TYPE_STRING: case ImmutableRecord::PHP_TYPE_INT: @@ -101,23 +107,23 @@ public function toArray(): array case ImmutableRecord::PHP_TYPE_ARRAY: if (\array_key_exists($key, $arrayPropItemTypeMap) && ! self::isScalarType($arrayPropItemTypeMap[$key])) { if ($isNullable && $this->{$key} === null) { - $nativeData[$key] = null; + $nativeData[$specialKey] = null; continue 2; } - $nativeData[$key] = \array_map(function ($item) use ($key, &$arrayPropItemTypeMap) { + $nativeData[$specialKey] = \array_map(function ($item) use ($key, &$arrayPropItemTypeMap) { return $this->voTypeToNative($item, $key, $arrayPropItemTypeMap[$key]); }, $this->{$key}); } else { - $nativeData[$key] = $this->{$key}; + $nativeData[$specialKey] = $this->{$key}; } break; default: if ($isNullable && (! isset($this->{$key}))) { - $nativeData[$key] = null; + $nativeData[$specialKey] = null; continue 2; } - $nativeData[$key] = $this->voTypeToNative($this->{$key}, $key, $type); + $nativeData[$specialKey] = $this->voTypeToNative($this->{$key}, $key, $type); } } @@ -126,7 +132,7 @@ public function toArray(): array public function equals(ImmutableRecord $other): bool { - if (get_class($this) !== get_class($other)) { + if (\get_class($this) !== \get_class($other)) { return false; } @@ -136,8 +142,14 @@ public function equals(ImmutableRecord $other): bool private function setRecordData(array $recordData): void { foreach ($recordData as $key => $value) { - $this->assertType($key, $value); - $this->{$key} = $value; + $specialKey = $key; + + if ($this instanceof SpecialKeySupport) { + $specialKey = $this->convertKeyForRecord($key); + } + + $this->assertType($specialKey, $value); + $this->{$specialKey} = $value; } } @@ -147,17 +159,23 @@ private function setNativeData(array $nativeData): void $arrayPropItemTypeMap = self::getArrayPropItemTypeMapFromMethodOrCache(); foreach ($nativeData as $key => $val) { - if (! isset(self::$__propTypeMap[$key])) { + $specialKey = $key; + + if ($this instanceof SpecialKeySupport) { + $specialKey = $this->convertKeyForRecord($key); + } + + if (! isset(self::$__propTypeMap[$specialKey])) { throw new \InvalidArgumentException(\sprintf( - 'Invalid property passed to Record %s. Got property with key ' . $key, + 'Invalid property passed to Record %s. Got property with key ' . $specialKey, \get_called_class() )); } - [$type, $isNative, $isNullable] = self::$__propTypeMap[$key]; + [$type, $isNative, $isNullable] = self::$__propTypeMap[$specialKey]; if ($val === null) { if (! $isNullable) { - throw new \RuntimeException("Got null for non nullable property $key of Record " . \get_called_class()); + throw new \RuntimeException("Got null for non nullable property $specialKey of Record " . \get_called_class()); } $recordData[$key] = null; @@ -172,9 +190,9 @@ private function setNativeData(array $nativeData): void $recordData[$key] = $val; break; case ImmutableRecord::PHP_TYPE_ARRAY: - if (\array_key_exists($key, $arrayPropItemTypeMap) && ! self::isScalarType($arrayPropItemTypeMap[$key])) { - $recordData[$key] = \array_map(function ($item) use ($key, &$arrayPropItemTypeMap) { - return $this->fromType($item, $arrayPropItemTypeMap[$key]); + if (\array_key_exists($specialKey, $arrayPropItemTypeMap) && ! self::isScalarType($arrayPropItemTypeMap[$specialKey])) { + $recordData[$key] = \array_map(function ($item) use ($specialKey, &$arrayPropItemTypeMap) { + return $this->fromType($item, $arrayPropItemTypeMap[$specialKey]); }, $val); } else { $recordData[$key] = $val; diff --git a/src/SpecialKeySupport.php b/src/SpecialKeySupport.php new file mode 100644 index 0000000..158c0d0 --- /dev/null +++ b/src/SpecialKeySupport.php @@ -0,0 +1,36 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace EventEngine\Data; + +/** + * Implement this interface in your ImmutableRecord class if you have special keys like snake_case. + */ +interface SpecialKeySupport +{ + /** + * Converts the given key to key name for the record. For example if the key is first_name and you have a class + * property firstName then you have to convert it to camel case. + * + * @param string $key + * @return string + */ + public function convertKeyForRecord(string $key): string; + + /** + * Converts the given key to key name for the array data. For example if you have a class property firstName + * and want to have snake case array keys then you have to convert it to first_name. + * + * @param string $key + * @return string + */ + public function convertKeyForArray(string $key): string; +} diff --git a/tests/ImmutableRecordDataConverterTest.php b/tests/ImmutableRecordDataConverterTest.php new file mode 100644 index 0000000..77c6e5c --- /dev/null +++ b/tests/ImmutableRecordDataConverterTest.php @@ -0,0 +1,121 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +declare(strict_types=1); + +namespace EventEngineTest\Data; + +use EventEngine\Data\ImmutableRecordDataConverter; +use EventEngineTest\Data\Stub\ImmutableItem; +use EventEngineTest\Data\Stub\TypeHintedImmutableRecordWithValueObjects; +use PHPUnit\Framework\TestCase; +use stdClass; + +final class ImmutableRecordDataConverterTest extends TestCase +{ + private $data = []; + + protected function setUp(): void + { + parent::setUp(); + + $this->data = [ + 'name' => 'test', + 'version' => 1, + 'itemList' => [['name' => 'one']], + 'access' => true, + ]; + } + + /** + * @test + */ + public function it_converts_immutable_record_to_array() + { + $valueObjects = TypeHintedImmutableRecordWithValueObjects::fromArray($this->data); + + $dataConverter = new ImmutableRecordDataConverter(); + + $this->data['type'] = null; + $this->data['percentage'] = 0.5; + + + $this->assertEquals( + $this->data, + $dataConverter->convertDataToArray( + TypeHintedImmutableRecordWithValueObjects::class, + $valueObjects + ) + ); + } + + /** + * @test + */ + public function it_returns_array_if_passed_as_input() + { + $input = ["a" => "test"]; + + $dataConverter = new ImmutableRecordDataConverter(); + + $output = $dataConverter->convertDataToArray('data', $input); + + $this->assertEquals($input, $output); + } + + /** + * @test + */ + public function it_returns_false_if_unknown_class_is_passed() + { + $dataConverter = new ImmutableRecordDataConverter(); + + $this->assertFalse($dataConverter->canConvertTypeToData(ImmutableItem::class . 'Unknown')); + } + + /** + * @test + */ + public function it_converts_stdClass_to_array() + { + $obj = new stdClass(); + + $obj->test = "This is a test"; + $obj->msg = "With a message"; + + $this->assertEquals([ + 'test' => "This is a test", + 'msg' => "With a message", + ], + (new ImmutableRecordDataConverter())->convertDataToArray(stdClass::class, $obj) + ); + } + + /** + * @test + */ + public function it_converts_array_to_immutable_record() + { + $dataConverter = new ImmutableRecordDataConverter(); + + $this->assertTrue($dataConverter->canConvertTypeToData(TypeHintedImmutableRecordWithValueObjects::class)); + + $valueObjects = $dataConverter->convertArrayToData( + TypeHintedImmutableRecordWithValueObjects::class, + $this->data + ); + + $this->data['type'] = null; + $this->data['percentage'] = 0.5; + + $this->assertEquals( + $this->data, + $valueObjects->toArray() + ); + } +} diff --git a/tests/ImmutableRecordLogicTest.php b/tests/ImmutableRecordLogicTest.php index 210ef1f..e8f9ab5 100644 --- a/tests/ImmutableRecordLogicTest.php +++ b/tests/ImmutableRecordLogicTest.php @@ -1,11 +1,12 @@ + * (c) 2018-2021 prooph software GmbH * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ + declare(strict_types=1); namespace EventEngineTest\Data; @@ -13,6 +14,8 @@ use EventEngineTest\Data\Stub\ImmutableItem; use EventEngineTest\Data\Stub\ImmutableRecordWithNoTypes; use EventEngineTest\Data\Stub\ImmutableRecordWithTypedGetters; +use EventEngineTest\Data\Stub\RecordWithSpecialKey; +use EventEngineTest\Data\Stub\RecordWithStringList; use EventEngineTest\Data\Stub\TypeHintedImmutableRecord; use EventEngineTest\Data\Stub\TypeHintedImmutableRecordWithValueObjects; use EventEngineTest\Data\Stub\ValueObject\Access; @@ -27,7 +30,7 @@ final class ImmutableRecordLogicTest extends TestCase { private $data = []; - protected function setUp() + protected function setUp(): void { parent::setUp(); @@ -110,6 +113,142 @@ public function it_takes_value_object_as_initialization_params() ); } + /** + * @test + */ + public function it_returns_new_record_with_changed_properties() + { + $valueObjects = TypeHintedImmutableRecordWithValueObjects::fromArray($this->data); + + $changedValueObjects = $valueObjects->with([ + 'version' => Version::fromInt(2), + 'percentage' => Percentage::fromFloat(0.9), + ]); + + $this->data['type'] = null; + $this->data['percentage'] = 0.5; + + $this->assertEquals( + $this->data, + $valueObjects->toArray() + ); + + $this->data['percentage'] = 0.9; + $this->data['version'] = 2; + + $this->assertEquals( + $this->data, + $changedValueObjects->toArray() + ); + } + + /** + * @test + */ + public function it_equals_other_record_with_same_values() + { + $valueObjects = TypeHintedImmutableRecordWithValueObjects::fromArray($this->data); + $other = TypeHintedImmutableRecordWithValueObjects::fromArray($this->data); + + $this->assertTrue($valueObjects->equals($other)); + } + + /** + * @test + */ + public function it_supports_special_keys(): void + { + // emulates snake_case + $recordArray = [ + RecordWithSpecialKey::BANK_ACCOUNT => '12324434', + RecordWithSpecialKey::SUCCESS_RATE => 33.33, + RecordWithSpecialKey::ITEM_LIST => [['name' => 'Awesome tester'], ['name' => 'John Smith']], + RecordWithSpecialKey::ITEM_ARRAY => [['name' => 'Awesome tester array'], ['name' => 'John Smith array']], + + ]; + $specialKey = RecordWithSpecialKey::fromArray($recordArray); + $this->assertSame($recordArray, $specialKey->toArray()); + + $specialKey = RecordWithSpecialKey::fromRecordData([ + RecordWithSpecialKey::BANK_ACCOUNT => $recordArray[RecordWithSpecialKey::BANK_ACCOUNT], + RecordWithSpecialKey::SUCCESS_RATE => Percentage::fromFloat($recordArray[RecordWithSpecialKey::SUCCESS_RATE]), + RecordWithSpecialKey::ITEM_LIST => ItemList::fromArray($recordArray[RecordWithSpecialKey::ITEM_LIST]), + RecordWithSpecialKey::ITEM_ARRAY => array_map( + static function (array $item) { + return ImmutableItem::fromArray($item); + }, + $recordArray[RecordWithSpecialKey::ITEM_ARRAY] + ), + ]); + $this->assertSame($recordArray, $specialKey->toArray()); + } + + /** + * @test + */ + public function it_throws_exception_if_unkown_property_provided() + { + $this->data['unknown'] = 'value'; + + $this->expectExceptionMessage('Invalid property passed to Record ' . TypeHintedImmutableRecordWithValueObjects::class . '. Got property with key unknown'); + + TypeHintedImmutableRecordWithValueObjects::fromArray($this->data); + } + + /** + * @test + */ + public function it_throws_exception_if_non_nullable_prop_is_missing() + { + unset($this->data['version']); + + $this->expectExceptionMessage('Missing record data for key version of record ' . TypeHintedImmutableRecord::class); + + TypeHintedImmutableRecord::fromArray($this->data); + } + + /** + * @test + */ + public function it_throws_exception_if_non_nullable_prop_should_be_set_to_null() + { + $this->data['version'] = null; + + $this->expectExceptionMessage('Got null for non nullable property version of Record ' . TypeHintedImmutableRecord::class); + + TypeHintedImmutableRecord::fromArray($this->data); + } + + /** + * @test + */ + public function it_throws_exception_if_property_value_has_wrong_type() + { + $this->data['version'] = 'v1'; + + $this->expectExceptionMessage(\sprintf( + 'Record %s data contains invalid value for property version. Expected type is int. Got type string.', + TypeHintedImmutableRecord::class + )); + + TypeHintedImmutableRecord::fromArray($this->data); + } + + /** + * @test + */ + public function it_throws_exception_if_array_property_contains_invalid_value() + { + $stringList = ['abc', 123, 'def']; + + $this->expectExceptionMessage(\sprintf( + 'Record %s data contains invalid value for property stringList. Value should be an array of string, but at least one item of the array has the wrong type.', + RecordWithStringList::class + )); + + RecordWithStringList::fromArray(['stringList' => $stringList]); + } + /** * @test */ diff --git a/tests/Stub/ImmutableItem.php b/tests/Stub/ImmutableItem.php index 32cdbfb..92df681 100644 --- a/tests/Stub/ImmutableItem.php +++ b/tests/Stub/ImmutableItem.php @@ -1,7 +1,7 @@ + * (c) 2018-2021 prooph software GmbH * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. diff --git a/tests/Stub/ImmutableRecordWithNoTypes.php b/tests/Stub/ImmutableRecordWithNoTypes.php index 3a30282..8ac85ef 100644 --- a/tests/Stub/ImmutableRecordWithNoTypes.php +++ b/tests/Stub/ImmutableRecordWithNoTypes.php @@ -1,7 +1,7 @@ + * (c) 2018-2021 prooph software GmbH * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. diff --git a/tests/Stub/ImmutableRecordWithTypedGetters.php b/tests/Stub/ImmutableRecordWithTypedGetters.php index d7260f4..85ea424 100644 --- a/tests/Stub/ImmutableRecordWithTypedGetters.php +++ b/tests/Stub/ImmutableRecordWithTypedGetters.php @@ -1,7 +1,7 @@ + * (c) 2018-2021 prooph software GmbH * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. diff --git a/tests/Stub/RecordWithSpecialKey.php b/tests/Stub/RecordWithSpecialKey.php new file mode 100644 index 0000000..a7b7249 --- /dev/null +++ b/tests/Stub/RecordWithSpecialKey.php @@ -0,0 +1,115 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace EventEngineTest\Data\Stub; + +use EventEngine\Data\ImmutableRecord; +use EventEngine\Data\ImmutableRecordLogic; +use EventEngine\Data\SpecialKeySupport; +use EventEngineTest\Data\Stub\ValueObject\ItemList; +use EventEngineTest\Data\Stub\ValueObject\Percentage; + +final class RecordWithSpecialKey implements ImmutableRecord, SpecialKeySupport +{ + use ImmutableRecordLogic; + + public const BANK_ACCOUNT = 'bank_account'; + public const SUCCESS_RATE = 'success_rate'; + public const ITEM_LIST = 'item_list'; + public const ITEM_ARRAY = 'item_array'; + + /** + * @var string + */ + private $bankAccount; + + /** + * @var Percentage + */ + private $successRate; + + /** + * @var ItemList + */ + private $itemList; + + /** + * @var array + */ + private $itemArray; + + /** + * @return mixed + */ + public function bankAccount(): string + { + return $this->bankAccount; + } + + /** + * @return Percentage + */ + public function successRate(): Percentage + { + return $this->successRate; + } + + /** + * @return ItemList + */ + public function itemList(): ItemList + { + return $this->itemList; + } + + /** + * @return array + */ + public function itemArray(): array + { + return $this->itemArray; + } + + public function convertKeyForRecord(string $key): string + { + switch ($key) { + case self::SUCCESS_RATE: + return 'successRate'; + case self::ITEM_LIST: + return 'itemList'; + case self::ITEM_ARRAY: + return 'itemArray'; + default: + return 'bankAccount'; + } + } + + public function convertKeyForArray(string $key): string + { + switch ($key) { + case 'successRate': + return self::SUCCESS_RATE; + case 'itemList': + return self::ITEM_LIST; + case 'itemArray': + return self::ITEM_ARRAY; + default: + return self::BANK_ACCOUNT; + } + } + + private static function arrayPropItemTypeMap(): array + { + return [ + 'itemArray' => ImmutableItem::class, + ]; + } +} diff --git a/tests/Stub/RecordWithStringList.php b/tests/Stub/RecordWithStringList.php new file mode 100644 index 0000000..059d359 --- /dev/null +++ b/tests/Stub/RecordWithStringList.php @@ -0,0 +1,34 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ +declare(strict_types=1); + +namespace EventEngineTest\Data\Stub; + +use EventEngine\Data\ImmutableRecord; +use EventEngine\Data\ImmutableRecordLogic; + +final class RecordWithStringList implements ImmutableRecord +{ + use ImmutableRecordLogic; + + private array $stringList; + + private static function arrayPropItemTypeMap(): array + { + return ['stringList' => ImmutableRecord::PHP_TYPE_STRING]; + } + + /** + * @return array + */ + public function stringList(): array + { + return $this->stringList; + } +} diff --git a/tests/Stub/TypeHintedImmutableRecord.php b/tests/Stub/TypeHintedImmutableRecord.php index 5496e80..5ae44d5 100644 --- a/tests/Stub/TypeHintedImmutableRecord.php +++ b/tests/Stub/TypeHintedImmutableRecord.php @@ -1,7 +1,7 @@ + * (c) 2018-2021 prooph software GmbH * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. diff --git a/tests/Stub/TypeHintedImmutableRecordWithValueObjects.php b/tests/Stub/TypeHintedImmutableRecordWithValueObjects.php index 7385553..07909ce 100644 --- a/tests/Stub/TypeHintedImmutableRecordWithValueObjects.php +++ b/tests/Stub/TypeHintedImmutableRecordWithValueObjects.php @@ -1,7 +1,7 @@ + * (c) 2018-2021 prooph software GmbH * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. diff --git a/tests/Stub/ValueObject/Access.php b/tests/Stub/ValueObject/Access.php index 7e09d31..cf7382b 100644 --- a/tests/Stub/ValueObject/Access.php +++ b/tests/Stub/ValueObject/Access.php @@ -1,7 +1,7 @@ + * (c) 2018-2021 prooph software GmbH * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. diff --git a/tests/Stub/ValueObject/ItemList.php b/tests/Stub/ValueObject/ItemList.php index 70f3d97..0bfc0a1 100644 --- a/tests/Stub/ValueObject/ItemList.php +++ b/tests/Stub/ValueObject/ItemList.php @@ -1,7 +1,7 @@ + * (c) 2018-2021 prooph software GmbH * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. diff --git a/tests/Stub/ValueObject/Name.php b/tests/Stub/ValueObject/Name.php index fffa4b7..342b3c0 100644 --- a/tests/Stub/ValueObject/Name.php +++ b/tests/Stub/ValueObject/Name.php @@ -1,7 +1,7 @@ + * (c) 2018-2021 prooph software GmbH * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. diff --git a/tests/Stub/ValueObject/Percentage.php b/tests/Stub/ValueObject/Percentage.php index b5283dd..145b3ac 100644 --- a/tests/Stub/ValueObject/Percentage.php +++ b/tests/Stub/ValueObject/Percentage.php @@ -1,7 +1,7 @@ + * (c) 2018-2021 prooph software GmbH * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. diff --git a/tests/Stub/ValueObject/Type.php b/tests/Stub/ValueObject/Type.php index bfe3e32..ff8c2ae 100644 --- a/tests/Stub/ValueObject/Type.php +++ b/tests/Stub/ValueObject/Type.php @@ -1,7 +1,7 @@ + * (c) 2018-2021 prooph software GmbH * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. diff --git a/tests/Stub/ValueObject/Version.php b/tests/Stub/ValueObject/Version.php index 70c2fc1..971f970 100644 --- a/tests/Stub/ValueObject/Version.php +++ b/tests/Stub/ValueObject/Version.php @@ -1,7 +1,7 @@ + * (c) 2018-2021 prooph software GmbH * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code.