From f1d9a8df54e6e420965cb7be26869a3f9ea1fab2 Mon Sep 17 00:00:00 2001 From: Eugene Ivanov <93479789+evgeek@users.noreply.github.com> Date: Sun, 8 Dec 2024 16:50:21 +0300 Subject: [PATCH] Fix Record Collection rows property (#53) --- CHANGELOG.md | 10 ++++++++ UPGRADE.md | 24 +++++++++++++++++++ src/Api/Record/AbstractRecord.php | 2 +- .../Collections/Traits/IteratorTrait.php | 2 +- .../Objects/Traits/FillMetaObjectTrait.php | 2 +- src/Http/GuzzleSenderFactory.php | 6 ++--- .../Unit/Formatters/MultiDecoderTestCase.php | 10 ++++++++ tests/Unit/Formatters/StringFormatTest.php | 2 +- 8 files changed, 51 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3599b91d..3c7ef7eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,16 @@ Все существенные изменения в проекте будут задокументированы в этом файле. Формат основан на [Keep a Changelog](https://keepachangelog.com/), и этот проект придерживается семантического версионирования ([semver](https://semver.org/)). +## v0.12.0[[Upgrade guide](/UPGRADE.md#v0120-changelog)] + +### Added + +* В `GuzzleSender` при помощи параметра `$requestOptions` можно задавать параметры запросов по умолчанию - допустим, таймаут. Полный список параметров можно найти в [документации Guzzle](https://docs.guzzlephp.org/en/stable/request-options.html). + +### Fixed + +* Поправлен баг, из-за которого в Record-коллекциях пустое свойство `rows` конвертировалось в `stdClass`. Теперь оно остаётся пустым массивом. + ## v0.11.1 ### Fixed diff --git a/UPGRADE.md b/UPGRADE.md index aae3eb3b..8fed0915 100644 --- a/UPGRADE.md +++ b/UPGRADE.md @@ -1,5 +1,29 @@ # Upgrade guide +## v0.12.0 [[Changelog](/CHANGELOG.md#v0120-upgrade-guide)] + +### Поправлен баг, из-за которого в Record-коллекциях пустое свойство rows конвертировалось в stdClass. Теперь оно остаётся пустым массивом. + +В большинстве случаев, обратная совместимость не нарушится. Однако, если у вас по какой-то причине присуствует логика, по которой пустая коллекция определяется по типу свойства `rows` - этот подход придётся пересмотреть. + +До: + +```php +$collection = Product::collection($ms)->get(); +if (is_a($collection->rows, stdClass::class)) { + echo 'Коллекция пустая'; +} +``` + +После: + +```php +$collection = Product::collection($ms)->get(); +if (count($collection->rows) === 0) { + echo 'Коллекция пустая'; +} +``` + ## v0.11.0 [[Changelog](/CHANGELOG.md#v0110-upgrade-guide)] ### Удалён класс `AttributeMetadata` и связанные с ним хелперы. diff --git a/src/Api/Record/AbstractRecord.php b/src/Api/Record/AbstractRecord.php index 766a9422..35d659e9 100644 --- a/src/Api/Record/AbstractRecord.php +++ b/src/Api/Record/AbstractRecord.php @@ -28,7 +28,7 @@ public function __get(string $name) public function __set(string $name, mixed $value) { if ( - !is_array($value) + (!is_array($value) || $value === []) && !(is_a($value, stdClass::class) && !is_a($value, self::class)) && !(is_string($value) && AbstractMultiDecoder::checkStringIsValidJson($value)) ) { diff --git a/src/Api/Record/Collections/Traits/IteratorTrait.php b/src/Api/Record/Collections/Traits/IteratorTrait.php index 8267d0b9..e2f12484 100644 --- a/src/Api/Record/Collections/Traits/IteratorTrait.php +++ b/src/Api/Record/Collections/Traits/IteratorTrait.php @@ -10,7 +10,7 @@ trait IteratorTrait public function current(): mixed { - return $this->getRows()[$this->iteratorKey]; + return $this->getRows()[$this->iteratorKey] ?? null; } public function next(): void diff --git a/src/Api/Record/Objects/Traits/FillMetaObjectTrait.php b/src/Api/Record/Objects/Traits/FillMetaObjectTrait.php index 8734c737..35b79e1b 100644 --- a/src/Api/Record/Objects/Traits/FillMetaObjectTrait.php +++ b/src/Api/Record/Objects/Traits/FillMetaObjectTrait.php @@ -10,7 +10,7 @@ trait FillMetaObjectTrait { protected function fillMeta(array $path, string $type): void { - if ($this->meta) { + if ($this->meta !== null) { return; } diff --git a/src/Http/GuzzleSenderFactory.php b/src/Http/GuzzleSenderFactory.php index 7c2aece9..96c1ad23 100644 --- a/src/Http/GuzzleSenderFactory.php +++ b/src/Http/GuzzleSenderFactory.php @@ -19,9 +19,9 @@ class GuzzleSenderFactory implements RequestSenderFactoryInterface /** * Стандартная фабрика Guzzle. * - * @param int $retries количество повторных попыток отправки запроса в случае неудачи - * @param int $exceptionTruncateAt максимальный размер сообщения об ошибке - * @param array $requestOptions https://docs.guzzlephp.org/en/stable/request-options.html + * @param int $retries количество повторных попыток отправки запроса в случае неудачи + * @param int $exceptionTruncateAt максимальный размер сообщения об ошибке + * @param array $requestOptions параметры запросов по умолчанию (https://docs.guzzlephp.org/en/stable/request-options.html) */ public function __construct( private readonly int $retries = 0, diff --git a/tests/Unit/Formatters/MultiDecoderTestCase.php b/tests/Unit/Formatters/MultiDecoderTestCase.php index e62d8105..ff886903 100644 --- a/tests/Unit/Formatters/MultiDecoderTestCase.php +++ b/tests/Unit/Formatters/MultiDecoderTestCase.php @@ -23,6 +23,8 @@ abstract class MultiDecoderTestCase extends TestCase protected const NULL_JSON_STRING = 'null'; protected const FALSE_JSON_STRING = 'false'; + protected const SKIP_TEST = 'SKIP_TEST'; + /** @var class-string */ protected const FORMATTER = AbstractMultiDecoder::class; protected JsonFormatterInterface $formatter; @@ -75,6 +77,10 @@ public static function correctDecodeDataProvider(): array /** @dataProvider invalidJsonTypesDataProvider */ public function testEncodeUnexpectedDataType(string $jsonString): void { + if ($jsonString === self::SKIP_TEST) { + $this->markTestSkipped(); + } + $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('Passed content is not valid json.'); @@ -92,6 +98,10 @@ public function testDecodeInvalidType(): void /** @dataProvider invalidJsonTypesDataProvider */ public function testDecodeInvalidString(string $jsonString): void { + if ($jsonString === self::SKIP_TEST) { + $this->markTestSkipped(); + } + $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('Passed content is not valid json.'); diff --git a/tests/Unit/Formatters/StringFormatTest.php b/tests/Unit/Formatters/StringFormatTest.php index e0d30192..144e024b 100644 --- a/tests/Unit/Formatters/StringFormatTest.php +++ b/tests/Unit/Formatters/StringFormatTest.php @@ -14,7 +14,7 @@ class StringFormatTest extends MultiDecoderTestCase public static function invalidJsonTypesDataProvider(): array { - return []; + return [[self::SKIP_TEST]]; } protected static function getEncodedObject(): string