Skip to content

Commit

Permalink
Fix Record Collection rows property (#53)
Browse files Browse the repository at this point in the history
  • Loading branch information
evgeek authored Dec 8, 2024
1 parent 388e460 commit f1d9a8d
Show file tree
Hide file tree
Showing 8 changed files with 51 additions and 7 deletions.
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
24 changes: 24 additions & 0 deletions UPGRADE.md
Original file line number Diff line number Diff line change
@@ -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` и связанные с ним хелперы.
Expand Down
2 changes: 1 addition & 1 deletion src/Api/Record/AbstractRecord.php
Original file line number Diff line number Diff line change
Expand Up @@ -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))
) {
Expand Down
2 changes: 1 addition & 1 deletion src/Api/Record/Collections/Traits/IteratorTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion src/Api/Record/Objects/Traits/FillMetaObjectTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ trait FillMetaObjectTrait
{
protected function fillMeta(array $path, string $type): void
{
if ($this->meta) {
if ($this->meta !== null) {
return;
}

Expand Down
6 changes: 3 additions & 3 deletions src/Http/GuzzleSenderFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
10 changes: 10 additions & 0 deletions tests/Unit/Formatters/MultiDecoderTestCase.php
Original file line number Diff line number Diff line change
Expand Up @@ -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<JsonFormatterInterface> */
protected const FORMATTER = AbstractMultiDecoder::class;
protected JsonFormatterInterface $formatter;
Expand Down Expand Up @@ -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.');

Expand All @@ -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.');

Expand Down
2 changes: 1 addition & 1 deletion tests/Unit/Formatters/StringFormatTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ class StringFormatTest extends MultiDecoderTestCase

public static function invalidJsonTypesDataProvider(): array
{
return [];
return [[self::SKIP_TEST]];
}

protected static function getEncodedObject(): string
Expand Down

0 comments on commit f1d9a8d

Please sign in to comment.