From 4f8c355d1bae51adea0af4a7fbfa25b9add406b2 Mon Sep 17 00:00:00 2001 From: Meritoo Date: Mon, 29 Mar 2021 19:02:28 +0200 Subject: [PATCH] Create and implement CollectionInterface as contract of all collections (e.g. based on the BaseCollection class) --- CHANGELOG.md | 1 + src/Collection/BaseCollection.php | 8 +-- .../Collection/CollectionInterface.php | 52 +++++++++++++++++++ .../Renderable/RenderableInterface.php | 2 +- src/Traits/Collection/AddTrait.php | 8 +-- src/Traits/CollectionTrait.php | 2 + src/Utilities/Reflection.php | 14 ++--- tests/Collection/BaseCollectionTest.php | 39 ++++++++------ 8 files changed, 93 insertions(+), 33 deletions(-) create mode 100644 src/Contract/Collection/CollectionInterface.php diff --git a/CHANGELOG.md b/CHANGELOG.md index fae7b31..be146a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ Common and useful classes, methods, exceptions etc. # 1.1.3 1. Move `Renderable` class: `Meritoo\Common` -> `Meritoo\Common\Contract` +2. Create and implement `CollectionInterface` as contract of all collections (e.g. based on the `BaseCollection` class) # 1.1.2 diff --git a/src/Collection/BaseCollection.php b/src/Collection/BaseCollection.php index 6ae692c..5eb5c3e 100644 --- a/src/Collection/BaseCollection.php +++ b/src/Collection/BaseCollection.php @@ -6,11 +6,11 @@ * file that was distributed with this source code. */ +declare(strict_types=1); + namespace Meritoo\Common\Collection; -use ArrayAccess; -use Countable; -use IteratorAggregate; +use Meritoo\Common\Contract\Collection\CollectionInterface; use Meritoo\Common\Traits\CollectionTrait; /** @@ -19,7 +19,7 @@ use Meritoo\Common\Traits\CollectionTrait; * @author Meritoo * @copyright Meritoo */ -abstract class BaseCollection implements Countable, ArrayAccess, IteratorAggregate +abstract class BaseCollection implements CollectionInterface { use CollectionTrait; diff --git a/src/Contract/Collection/CollectionInterface.php b/src/Contract/Collection/CollectionInterface.php new file mode 100644 index 0000000..df84414 --- /dev/null +++ b/src/Contract/Collection/CollectionInterface.php @@ -0,0 +1,52 @@ + + * @copyright Meritoo + */ +interface CollectionInterface extends Countable, ArrayAccess, IteratorAggregate +{ + public function toArray(): array; + + public function add($element, $index = null): void; + + public function addMultiple($elements, bool $useIndexes = false): void; + + public function prepend($element): void; + + public function remove($element): void; + + public function getPrevious($element); + + public function getNext($element); + + public function getFirst(); + + public function getLast(); + + public function getByIndex($index); + + public function isEmpty(): bool; + + public function isFirst($element): bool; + + public function isLast($element): bool; + + public function has($element): bool; +} diff --git a/src/Contract/Renderable/RenderableInterface.php b/src/Contract/Renderable/RenderableInterface.php index 2fb041a..12581b0 100644 --- a/src/Contract/Renderable/RenderableInterface.php +++ b/src/Contract/Renderable/RenderableInterface.php @@ -13,7 +13,7 @@ namespace Meritoo\Common\Contract\Renderable; use Meritoo\Common\Collection\Templates; /** - * Something that may be rendered + * Interface/Contract of something that may be rendered * * @author Meritoo * @copyright Meritoo diff --git a/src/Traits/Collection/AddTrait.php b/src/Traits/Collection/AddTrait.php index 4ac35aa..62b715d 100644 --- a/src/Traits/Collection/AddTrait.php +++ b/src/Traits/Collection/AddTrait.php @@ -8,7 +8,7 @@ namespace Meritoo\Common\Traits\Collection; -use Meritoo\Common\Collection\BaseCollection; +use Meritoo\Common\Contract\Collection\CollectionInterface; /** * Trait for the Collection with add*() methods @@ -42,9 +42,9 @@ trait AddTrait /** * Adds given elements (at the end of collection) * - * @param array|BaseCollection $elements The elements to add - * @param bool $useIndexes (optional) If is set to true, indexes of given elements will be used in - * this collection. Otherwise - not. + * @param array|CollectionInterface $elements The elements to add + * @param bool $useIndexes (optional) If is set to true, indexes of given elements will be + * used in this collection. Otherwise - not. */ public function addMultiple($elements, bool $useIndexes = false): void { diff --git a/src/Traits/CollectionTrait.php b/src/Traits/CollectionTrait.php index d7ac305..4ffafa1 100644 --- a/src/Traits/CollectionTrait.php +++ b/src/Traits/CollectionTrait.php @@ -6,6 +6,8 @@ * file that was distributed with this source code. */ +declare(strict_types=1); + namespace Meritoo\Common\Traits; use Meritoo\Common\Traits\Collection\AddTrait; diff --git a/src/Utilities/Reflection.php b/src/Utilities/Reflection.php index 90ed38a..d6f7ebc 100644 --- a/src/Utilities/Reflection.php +++ b/src/Utilities/Reflection.php @@ -10,7 +10,7 @@ namespace Meritoo\Common\Utilities; use Doctrine\Inflector\InflectorFactory; use Doctrine\Persistence\Proxy; -use Meritoo\Common\Collection\BaseCollection; +use Meritoo\Common\Contract\Collection\CollectionInterface; use Meritoo\Common\Exception\Reflection\CannotResolveClassNameException; use Meritoo\Common\Exception\Reflection\MissingChildClassesException; use Meritoo\Common\Exception\Reflection\NotExistingPropertyException; @@ -207,11 +207,11 @@ class Reflection * Returns values of given property for given objects. * Looks for proper getter for the property. * - * @param array|BaseCollection|object $objects The objects that should contain given property. It may be also one - * object. - * @param string $property Name of the property that contains a value - * @param bool $force (optional) If is set to true, try to retrieve value even if the - * object does not have property. Otherwise - not. + * @param array|CollectionInterface|object $objects The objects that should contain given property. It may be also + * one object. + * @param string $property Name of the property that contains a value + * @param bool $force (optional) If is set to true, try to retrieve value even if + * the object does not have property. Otherwise - not. * @return array */ public static function getPropertyValues($objects, string $property, bool $force = false): array @@ -224,7 +224,7 @@ class Reflection return []; } - if ($objects instanceof BaseCollection) { + if ($objects instanceof CollectionInterface) { $objects = $objects->toArray(); } diff --git a/tests/Collection/BaseCollectionTest.php b/tests/Collection/BaseCollectionTest.php index 1883e8b..798362b 100644 --- a/tests/Collection/BaseCollectionTest.php +++ b/tests/Collection/BaseCollectionTest.php @@ -13,6 +13,7 @@ use Generator; use Meritoo\Common\Collection\BaseCollection; use Meritoo\Common\Collection\DateTimeCollection; use Meritoo\Common\Collection\StringCollection; +use Meritoo\Common\Contract\Collection\CollectionInterface; use Meritoo\Common\Test\Base\BaseTestCase; use Meritoo\Common\Type\OopVisibilityType; use Meritoo\Test\Common\Collection\BaseCollection\FirstNamesCollection; @@ -139,15 +140,19 @@ class BaseCollectionTest extends BaseTestCase } /** - * @param mixed $element The element to add - * @param int $expectedCount Expected count of elements in collection - * @param int $expectedIndex Expected index of added element in collection - * @param BaseCollection $collection The collection + * @param mixed $element The element to add + * @param int $expectedCount Expected count of elements in collection + * @param int $expectedIndex Expected index of added element in collection + * @param CollectionInterface $collection The collection * * @dataProvider provideElementToAdd */ - public function testAddWithoutIndex($element, $expectedCount, $expectedIndex, BaseCollection $collection) - { + public function testAddWithoutIndex( + $element, + int $expectedCount, + int $expectedIndex, + CollectionInterface $collection + ) { $collection->add($element); static::assertTrue($collection->has($element)); @@ -156,15 +161,15 @@ class BaseCollectionTest extends BaseTestCase } /** - * @param mixed $element The element to add - * @param mixed $index Index of element to add - * @param int $expectedCount Expected count of elements in collection - * @param int $expectedIndex Expected index of added element in collection - * @param BaseCollection $collection The collection + * @param mixed $element The element to add + * @param mixed $index Index of element to add + * @param int $expectedCount Expected count of elements in collection + * @param int $expectedIndex Expected index of added element in collection + * @param CollectionInterface $collection The collection * * @dataProvider provideElementToAddWithIndex */ - public function testAddWithIndex($element, $index, $expectedCount, $expectedIndex, BaseCollection $collection) + public function testAddWithIndex($element, $index, $expectedCount, $expectedIndex, CollectionInterface $collection) { $collection->add($element, $index); @@ -340,14 +345,14 @@ class BaseCollectionTest extends BaseTestCase } /** - * @param string $description Description of test - * @param BaseCollection $collection Collection to search for element with given index - * @param mixed $index Index / key of the element - * @param mixed $expected Expected element with given index + * @param string $description Description of test + * @param CollectionInterface $collection Collection to search for element with given index + * @param mixed $index Index / key of the element + * @param mixed $expected Expected element with given index * * @dataProvider provideElementGetByIndex */ - public function testGetByIndex($description, BaseCollection $collection, $index, $expected) + public function testGetByIndex($description, CollectionInterface $collection, $index, $expected) { static::assertEquals($expected, $collection->getByIndex($index), $description); }