diff --git a/composer.json b/composer.json index a7c194b..9fc0198 100644 --- a/composer.json +++ b/composer.json @@ -37,11 +37,11 @@ }, "require-dev": { "maglnet/composer-require-checker": "^4.7.1", - "phpunit/phpunit": "^10.5.45", - "rector/rector": "^2.0.9", + "phpunit/phpunit": "^10.5.46", + "rector/rector": "^2.0.15", "roave/infection-static-analysis-plugin": "^1.35", "spatie/phpunit-watcher": "^1.24", - "vimeo/psalm": "^5.26.1 || ^6.9.1" + "vimeo/psalm": "^5.26.1 || ^6.10.3" }, "autoload": { "psr-4": { diff --git a/src/Reader/Filter/In.php b/src/Reader/Filter/In.php index 525b70f..76c0d43 100644 --- a/src/Reader/Filter/In.php +++ b/src/Reader/Filter/In.php @@ -7,6 +7,9 @@ use InvalidArgumentException; use Yiisoft\Data\Reader\FilterInterface; +use function is_scalar; +use function sprintf; + /** * `In` filter defines a criteria for ensuring field value matches one of the value provided. */ diff --git a/src/Reader/Iterable/FilterHandler/AllHandler.php b/src/Reader/Iterable/FilterHandler/AllHandler.php index ca6c3a5..4fa14f8 100644 --- a/src/Reader/Iterable/FilterHandler/AllHandler.php +++ b/src/Reader/Iterable/FilterHandler/AllHandler.php @@ -9,6 +9,8 @@ use Yiisoft\Data\Reader\FilterInterface; use Yiisoft\Data\Reader\Iterable\IterableFilterHandlerInterface; +use function sprintf; + /** * `All` iterable filter handler allows combining multiple sub-filters. * The filter matches only if all the sub-filters match. @@ -27,7 +29,9 @@ public function match(object|array $item, FilterInterface $filter, array $iterab foreach ($filter->getFilters() as $subFilter) { $filterHandler = $iterableFilterHandlers[$subFilter::class] ?? null; if ($filterHandler === null) { - throw new LogicException(sprintf('Filter "%s" is not supported.', $subFilter::class)); + throw new LogicException( + sprintf('Filter "%s" is not supported.', $subFilter::class), + ); } if (!$filterHandler->match($item, $subFilter, $iterableFilterHandlers)) { return false; diff --git a/src/Reader/Iterable/FilterHandler/AnyHandler.php b/src/Reader/Iterable/FilterHandler/AnyHandler.php index c26708d..1f5349e 100644 --- a/src/Reader/Iterable/FilterHandler/AnyHandler.php +++ b/src/Reader/Iterable/FilterHandler/AnyHandler.php @@ -9,6 +9,8 @@ use Yiisoft\Data\Reader\FilterInterface; use Yiisoft\Data\Reader\Iterable\IterableFilterHandlerInterface; +use function sprintf; + /** * `Any` iterable filter handler allows combining multiple sub-filters. * The filter matches if any of the sub-filters match. @@ -27,7 +29,9 @@ public function match(object|array $item, FilterInterface $filter, array $iterab foreach ($filter->getFilters() as $subFilter) { $filterHandler = $iterableFilterHandlers[$subFilter::class] ?? null; if ($filterHandler === null) { - throw new LogicException(sprintf('Filter "%s" is not supported.', $subFilter::class)); + throw new LogicException( + sprintf('Filter "%s" is not supported.', $subFilter::class), + ); } if ($filterHandler->match($item, $subFilter, $iterableFilterHandlers)) { return true; diff --git a/src/Reader/Iterable/IterableDataReader.php b/src/Reader/Iterable/IterableDataReader.php index 0a3911f..54cb77d 100644 --- a/src/Reader/Iterable/IterableDataReader.php +++ b/src/Reader/Iterable/IterableDataReader.php @@ -253,9 +253,7 @@ private function sortItems(iterable $items, Sort $sort): iterable $items, static function (array|object $itemA, array|object $itemB) use ($criteria) { foreach ($criteria as $key => $order) { - /** @psalm-var mixed $valueA */ $valueA = ArrayHelper::getValue($itemA, $key); - /** @psalm-var mixed $valueB */ $valueB = ArrayHelper::getValue($itemB, $key); if ($valueB === $valueA) { @@ -311,7 +309,7 @@ private function prepareFilterHandlers(array $filterHandlers): array */ private function iterableToArray(iterable $iterable): array { - return $iterable instanceof Traversable ? iterator_to_array($iterable, true) : $iterable; + return $iterable instanceof Traversable ? iterator_to_array($iterable) : $iterable; } public function getFilter(): ?FilterInterface diff --git a/tests/Paginator/KeysetPaginatorTest.php b/tests/Paginator/KeysetPaginatorTest.php index f0b6781..8a26ee3 100644 --- a/tests/Paginator/KeysetPaginatorTest.php +++ b/tests/Paginator/KeysetPaginatorTest.php @@ -34,7 +34,7 @@ use function reset; use function sprintf; -final class KeysetPaginatorTest extends Testcase +final class KeysetPaginatorTest extends TestCase { use PageTokenAssertTrait; diff --git a/tests/Paginator/OffsetPaginatorTest.php b/tests/Paginator/OffsetPaginatorTest.php index 5989d01..5a0021a 100644 --- a/tests/Paginator/OffsetPaginatorTest.php +++ b/tests/Paginator/OffsetPaginatorTest.php @@ -7,6 +7,7 @@ use InvalidArgumentException; use LogicException; use PHPUnit\Framework\Attributes\DataProvider; +use Yiisoft\Data\Paginator\InvalidPageException; use Yiisoft\Data\Paginator\OffsetPaginator; use Yiisoft\Data\Paginator\PageNotFoundException; use Yiisoft\Data\Paginator\PageToken; @@ -601,6 +602,16 @@ public function testWithNulledPageToken(): void $this->assertFalse($token->isPrevious); } + public function testWithNegativeToken(): void + { + $paginator = new OffsetPaginator(new IterableDataReader([])); + $token = PageToken::next('-1'); + + $this->expectException(InvalidPageException::class); + $this->expectExceptionMessage('Current page should be at least 1.'); + $paginator->withToken($token); + } + public function testLimitedDataReaderTotalItems(): void { $dataReader = (new IterableDataReader(self::DEFAULT_DATASET))->withLimit(3); diff --git a/tests/TestCase.php b/tests/TestCase.php index 63cf0e0..09b11a2 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -6,7 +6,6 @@ use DateTimeImmutable; use DateTimeInterface; -use ReflectionException; use ReflectionObject; use stdClass; use Traversable; @@ -87,28 +86,19 @@ protected function getInaccessibleProperty(object $object, string $propertyName) $class = $class->getParentClass(); } - $property = $class->getProperty($propertyName); - $property->setAccessible(true); - $result = $property->getValue($object); - $property->setAccessible(false); - - return $result; + return $class + ->getProperty($propertyName) + ->getValue($object); } /** * Invokes an inaccessible method. - * - * @throws ReflectionException */ protected function invokeMethod(object $object, string $method, array $args = []): mixed { - $reflection = new ReflectionObject($object); - $method = $reflection->getMethod($method); - $method->setAccessible(true); - $result = $method->invokeArgs($object, $args); - $method->setAccessible(false); - - return $result; + return (new ReflectionObject($object)) + ->getMethod($method) + ->invokeArgs($object, $args); } protected function iterableToArray(iterable $iterable): array