Skip to content

Commit 54e7235

Browse files
matijn-madenicolas-grekas
authored andcommitted
[TypeInfo] Simple array should be array type
1 parent b9321aa commit 54e7235

File tree

7 files changed

+132
-5
lines changed

7 files changed

+132
-5
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace Symfony\Component\JsonStreamer\Tests\Fixtures\Model;
4+
5+
class DummyWithList
6+
{
7+
/** @var list<ClassicDummy> */
8+
public array $dummies;
9+
10+
public string $customProperty;
11+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace Symfony\Component\JsonStreamer\Tests\Fixtures\Model;
4+
5+
class DummyWithNestedList
6+
{
7+
/** @var list<DummyWithList> */
8+
public array $dummies;
9+
10+
public string $stringProperty;
11+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?php
2+
3+
return static function (mixed $data, \Psr\Container\ContainerInterface $valueTransformers, array $options): \Traversable {
4+
try {
5+
yield '[';
6+
$prefix = '';
7+
foreach ($data as $value1) {
8+
yield $prefix;
9+
yield '{"dummies":{';
10+
$prefix = '';
11+
foreach ($value1->dummies as $key2 => $value2) {
12+
$key2 = is_int($key2) ? $key2 : \substr(\json_encode($key2), 1, -1);
13+
yield "{$prefix}\"{$key2}\":";
14+
yield '{"dummies":{';
15+
$prefix = '';
16+
foreach ($value2->dummies as $key3 => $value3) {
17+
$key3 = is_int($key3) ? $key3 : \substr(\json_encode($key3), 1, -1);
18+
yield "{$prefix}\"{$key3}\":";
19+
yield '{"id":';
20+
yield \json_encode($value3->id, \JSON_THROW_ON_ERROR, 506);
21+
yield ',"name":';
22+
yield \json_encode($value3->name, \JSON_THROW_ON_ERROR, 506);
23+
yield '}';
24+
$prefix = ',';
25+
}
26+
yield '},"customProperty":';
27+
yield \json_encode($value2->customProperty, \JSON_THROW_ON_ERROR, 508);
28+
yield '}';
29+
$prefix = ',';
30+
}
31+
yield '},"stringProperty":';
32+
yield \json_encode($value1->stringProperty, \JSON_THROW_ON_ERROR, 510);
33+
yield '}';
34+
$prefix = ',';
35+
}
36+
yield ']';
37+
} catch (\JsonException $e) {
38+
throw new \Symfony\Component\JsonStreamer\Exception\NotEncodableValueException($e->getMessage(), 0, $e);
39+
}
40+
};
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
return static function (mixed $data, \Psr\Container\ContainerInterface $valueTransformers, array $options): \Traversable {
4+
try {
5+
yield '[';
6+
$prefix = '';
7+
foreach ($data as $value1) {
8+
yield $prefix;
9+
yield '{"dummies":{';
10+
$prefix = '';
11+
foreach ($value1->dummies as $key2 => $value2) {
12+
$key2 = is_int($key2) ? $key2 : \substr(\json_encode($key2), 1, -1);
13+
yield "{$prefix}\"{$key2}\":";
14+
yield '{"id":';
15+
yield \json_encode($value2->id, \JSON_THROW_ON_ERROR, 508);
16+
yield ',"name":';
17+
yield \json_encode($value2->name, \JSON_THROW_ON_ERROR, 508);
18+
yield '}';
19+
$prefix = ',';
20+
}
21+
yield '},"customProperty":';
22+
yield \json_encode($value1->customProperty, \JSON_THROW_ON_ERROR, 510);
23+
yield '}';
24+
$prefix = ',';
25+
}
26+
yield ']';
27+
} catch (\JsonException $e) {
28+
throw new \Symfony\Component\JsonStreamer\Exception\NotEncodableValueException($e->getMessage(), 0, $e);
29+
}
30+
};

Tests/JsonStreamWriterTest.php

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@
1919
use Symfony\Component\JsonStreamer\Tests\Fixtures\Model\DummyWithArray;
2020
use Symfony\Component\JsonStreamer\Tests\Fixtures\Model\DummyWithDateTimes;
2121
use Symfony\Component\JsonStreamer\Tests\Fixtures\Model\DummyWithGenerics;
22+
use Symfony\Component\JsonStreamer\Tests\Fixtures\Model\DummyWithList;
2223
use Symfony\Component\JsonStreamer\Tests\Fixtures\Model\DummyWithNameAttributes;
2324
use Symfony\Component\JsonStreamer\Tests\Fixtures\Model\DummyWithNestedArray;
25+
use Symfony\Component\JsonStreamer\Tests\Fixtures\Model\DummyWithNestedList;
2426
use Symfony\Component\JsonStreamer\Tests\Fixtures\Model\DummyWithNullableProperties;
2527
use Symfony\Component\JsonStreamer\Tests\Fixtures\Model\DummyWithPhpDoc;
2628
use Symfony\Component\JsonStreamer\Tests\Fixtures\Model\DummyWithUnionProperties;
@@ -119,7 +121,7 @@ public function testWriteCollection()
119121
$dummyWithArray2->customProperty = 'customProperty2';
120122

121123
$this->assertWritten(
122-
'[{"dummies":[{"id":1,"name":"dummy"}],"customProperty":"customProperty1"},{"dummies":[{"id":1,"name":"dummy"}],"customProperty":"customProperty2"}]',
124+
'[{"dummies":{"0":{"id":1,"name":"dummy"}},"customProperty":"customProperty1"},{"dummies":{"0":{"id":1,"name":"dummy"}},"customProperty":"customProperty2"}]',
123125
[$dummyWithArray1, $dummyWithArray2],
124126
Type::list(Type::object(DummyWithArray::class)),
125127
);
@@ -133,10 +135,38 @@ public function testWriteCollection()
133135
$dummyWithNestedArray2->stringProperty = 'stringProperty2';
134136

135137
$this->assertWritten(
136-
'[{"dummies":[{"dummies":[{"id":1,"name":"dummy"}],"customProperty":"customProperty1"}],"stringProperty":"stringProperty1"},{"dummies":[{"dummies":[{"id":1,"name":"dummy"}],"customProperty":"customProperty2"}],"stringProperty":"stringProperty2"}]',
138+
'[{"dummies":{"0":{"dummies":{"0":{"id":1,"name":"dummy"}},"customProperty":"customProperty1"}},"stringProperty":"stringProperty1"},{"dummies":{"0":{"dummies":{"0":{"id":1,"name":"dummy"}},"customProperty":"customProperty2"}},"stringProperty":"stringProperty2"}]',
137139
[$dummyWithNestedArray1, $dummyWithNestedArray2],
138140
Type::list(Type::object(DummyWithNestedArray::class)),
139141
);
142+
143+
$dummyWithList1 = new DummyWithList();
144+
$dummyWithList1->dummies = [new ClassicDummy()];
145+
$dummyWithList1->customProperty = 'customProperty1';
146+
147+
$dummyWithList2 = new DummyWithList();
148+
$dummyWithList2->dummies = [new ClassicDummy()];
149+
$dummyWithList2->customProperty = 'customProperty2';
150+
151+
$this->assertWritten(
152+
'[{"dummies":[{"id":1,"name":"dummy"}],"customProperty":"customProperty1"},{"dummies":[{"id":1,"name":"dummy"}],"customProperty":"customProperty2"}]',
153+
[$dummyWithList1, $dummyWithList2],
154+
Type::list(Type::object(DummyWithList::class)),
155+
);
156+
157+
$dummyWithNestedList1 = new DummyWithNestedList();
158+
$dummyWithNestedList1->dummies = [$dummyWithList1];
159+
$dummyWithNestedList1->stringProperty = 'stringProperty1';
160+
161+
$dummyWithNestedList2 = new DummyWithNestedList();
162+
$dummyWithNestedList2->dummies = [$dummyWithList2];
163+
$dummyWithNestedList2->stringProperty = 'stringProperty2';
164+
165+
$this->assertWritten(
166+
'[{"dummies":[{"dummies":[{"id":1,"name":"dummy"}],"customProperty":"customProperty1"}],"stringProperty":"stringProperty1"},{"dummies":[{"dummies":[{"id":1,"name":"dummy"}],"customProperty":"customProperty2"}],"stringProperty":"stringProperty2"}]',
167+
[$dummyWithNestedList1, $dummyWithNestedList2],
168+
Type::list(Type::object(DummyWithNestedList::class)),
169+
);
140170
}
141171

142172
public function testWriteObject()

Tests/Write/StreamWriterGeneratorTest.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@
2222
use Symfony\Component\JsonStreamer\Tests\Fixtures\Enum\DummyEnum;
2323
use Symfony\Component\JsonStreamer\Tests\Fixtures\Model\ClassicDummy;
2424
use Symfony\Component\JsonStreamer\Tests\Fixtures\Model\DummyWithArray;
25+
use Symfony\Component\JsonStreamer\Tests\Fixtures\Model\DummyWithList;
2526
use Symfony\Component\JsonStreamer\Tests\Fixtures\Model\DummyWithNameAttributes;
2627
use Symfony\Component\JsonStreamer\Tests\Fixtures\Model\DummyWithNestedArray;
28+
use Symfony\Component\JsonStreamer\Tests\Fixtures\Model\DummyWithNestedList;
2729
use Symfony\Component\JsonStreamer\Tests\Fixtures\Model\DummyWithOtherDummies;
2830
use Symfony\Component\JsonStreamer\Tests\Fixtures\Model\DummyWithUnionProperties;
2931
use Symfony\Component\JsonStreamer\Tests\Fixtures\Model\DummyWithValueTransformerAttributes;
@@ -95,8 +97,11 @@ public static function generatedStreamWriterDataProvider(): iterable
9597
yield ['null_list', Type::list(Type::null())];
9698
yield ['object_list', Type::list(Type::object(DummyWithNameAttributes::class))];
9799
yield ['nullable_object_list', Type::nullable(Type::list(Type::object(DummyWithNameAttributes::class)))];
98-
yield ['nested_list', Type::list(Type::object(DummyWithArray::class))];
99-
yield ['double_nested_list', Type::list(Type::object(DummyWithNestedArray::class))];
100+
yield ['nested_list', Type::list(Type::object(DummyWithList::class))];
101+
yield ['double_nested_list', Type::list(Type::object(DummyWithNestedList::class))];
102+
103+
yield ['nested_array', Type::list(Type::object(DummyWithArray::class))];
104+
yield ['double_nested_array', Type::list(Type::object(DummyWithNestedArray::class))];
100105

101106
yield ['dict', Type::dict()];
102107
yield ['object_dict', Type::dict(Type::object(DummyWithNameAttributes::class))];

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
"psr/container": "^1.1|^2.0",
2222
"psr/log": "^1|^2|^3",
2323
"symfony/filesystem": "^7.2",
24-
"symfony/type-info": "^7.3.3",
24+
"symfony/type-info": "~7.3.8|^7.4.1",
2525
"symfony/var-exporter": "^7.2"
2626
},
2727
"require-dev": {

0 commit comments

Comments
 (0)