Skip to content

Commit 27ff3b9

Browse files
committed
[PHPStan] Merge remote-tracking branch 'origin/master' into PHPStan
# Conflicts: # composer.json # composer.lock
2 parents ccaa148 + 2c76a02 commit 27ff3b9

File tree

2 files changed

+51
-28
lines changed

2 files changed

+51
-28
lines changed

src/FactoryInterface.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
<?php
22

3+
declare(strict_types=1);
4+
35
namespace Cubicl\ObjectGraphGenerator;
46

5-
use Cubicl\ObjectGraphGenerator\ObjectGraphGenerator;
67
use Faker\Generator;
78

89
interface FactoryInterface

src/ObjectGraphGenerator.php

Lines changed: 49 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -19,35 +19,40 @@ class ObjectGraphGenerator
1919
{
2020
private const DEFAULT_SEED = 1;
2121

22-
/** @var Generator */
23-
private $fakerInstance;
24-
25-
/** @var PropertyInfoExtractor */
26-
private $propertyInfo;
27-
28-
/** @var array */
29-
private $registry;
30-
31-
/** @var array */
32-
private $temporaryRegistry = [];
22+
private Generator $fakerInstance;
23+
private PropertyInfoExtractor $propertyInfo;
24+
/** @var array<mixed> */
25+
private array $registry;
26+
/** @var array<mixed> */
27+
private array $temporaryRegistry = [];
3328

29+
/**
30+
* @param array<mixed> $registry
31+
*/
3432
public function __construct(array $registry = [])
3533
{
3634
$this->fakerInstance = Factory::create();
3735

38-
$phpDocExtractor = new PhpDocExtractor();
36+
$phpDocExtractor = new PhpDocExtractor();
3937
$reflectionExtractor = new ReflectionExtractor();
40-
$typeExtractors = [$phpDocExtractor, $reflectionExtractor];
41-
$this->propertyInfo = new PropertyInfoExtractor([], $typeExtractors, [], [], []);
38+
$typeExtractors = [$phpDocExtractor, $reflectionExtractor];
39+
$this->propertyInfo = new PropertyInfoExtractor([], $typeExtractors, [], [], []);
4240
$this->fakerInstance->seed(self::DEFAULT_SEED);
4341
$this->registry = $registry;
4442
}
4543

44+
/**
45+
* @param class-string $className
46+
*/
4647
public function generate(string $className): object
4748
{
4849
return $this->generateObject($className);
4950
}
5051

52+
/**
53+
* @param class-string $className
54+
* @param array<mixed> $config
55+
*/
5156
public function generateWithTemporaryConfig(string $className, array $config): object
5257
{
5358
$this->temporaryRegistry = $config;
@@ -58,18 +63,16 @@ public function generateWithTemporaryConfig(string $className, array $config): o
5863
}
5964

6065
/**
61-
* @param string $className
62-
*
63-
* @return mixed|object
66+
* @param class-string $className
6467
* @throws ReflectionException
6568
*/
66-
private function generateObject(string $className)
69+
private function generateObject(string $className): object
6770
{
6871
if ($this->isInRegistry($className)) {
6972
return $this->getFromRegistry($className);
7073
}
7174

72-
$class = new ReflectionClass($className);
75+
$class = new ReflectionClass($className);
7376
$factoryMethod = $this->findFactoryMethod($class);
7477

7578
if ($factoryMethod === null) {
@@ -78,6 +81,7 @@ private function generateObject(string $className)
7881

7982
$arguments = array_map(
8083
function (ReflectionParameter $parameter) use ($className) {
84+
/** @var array<mixed> $type */
8185
$type = $this->propertyInfo->getTypes($className, $parameter->getName());
8286

8387
return $this->generateArgument($type[0], $className, $parameter->getName());
@@ -90,13 +94,17 @@ function (ReflectionParameter $parameter) use ($className) {
9094
: $factoryMethod->invokeArgs(null, $arguments);
9195
}
9296

97+
/**
98+
* @param ReflectionClass<object> $class
99+
*/
93100
private function findFactoryMethod(ReflectionClass $class): ?ReflectionMethod
94101
{
95102
try {
96103
return $class->getMethod('createNew');
97104
} catch (ReflectionException $e) {
98105
// Do nothing here
99106
}
107+
100108
try {
101109
return $class->getMethod('create');
102110
} catch (ReflectionException $e) {
@@ -105,47 +113,57 @@ private function findFactoryMethod(ReflectionClass $class): ?ReflectionMethod
105113
}
106114

107115
/**
108-
* @param Type $type
109-
*
110-
* @param string $className
111-
* @param string $argumentName
112-
*
113116
* @return mixed
114117
* @throws ReflectionException
115118
*/
116119
private function generateArgument(Type $type, string $className, string $argumentName)
117120
{
118121
$faker = $type->isNullable() ? $this->fakerInstance->optional() : $this->fakerInstance;
119122
$key = sprintf('%s:%s', $className, $argumentName);
123+
120124
if ($this->isInRegistry($key)) {
121125
return $this->getFromRegistry($key);
122126
}
123127

124128
switch ($type->getBuiltinType()) {
125129
case Type::BUILTIN_TYPE_INT:
126130
return $faker->randomNumber(5);
131+
127132
case Type::BUILTIN_TYPE_FLOAT:
128133
return $faker->randomFloat();
134+
129135
case Type::BUILTIN_TYPE_STRING:
130136
return $faker->text(100);
137+
131138
case Type::BUILTIN_TYPE_BOOL:
132139
return $faker->boolean();
140+
133141
case Type::BUILTIN_TYPE_ARRAY:
134142
$collection = [];
143+
135144
if ($type->isCollection()) {
136145
$collection = array_map(
137146
function () use ($argumentName, $className, $type) {
138-
return $this->generateArgument($type->getCollectionValueType(), $className, $argumentName);
147+
/** @var Type $collectionValueType */
148+
$collectionValueType = $type->getCollectionValueType();
149+
150+
return $this->generateArgument($collectionValueType, $className, $argumentName);
139151
},
140152
range(0, $faker->numberBetween(0, 10))
141153
);
142154
}
155+
143156
return $faker->passthrough($collection);
157+
144158
case Type::BUILTIN_TYPE_OBJECT:
145-
if ($type->getClassName() === 'DateTime') {
159+
/** @var class-string $className */
160+
$className = $type->getClassName();
161+
162+
if ($className === 'DateTime') {
146163
return $faker->dateTime();
147164
}
148-
return $faker->passthrough($this->generateObject($type->getClassName()));
165+
166+
return $faker->passthrough($this->generateObject($className));
149167
}
150168
}
151169

@@ -154,11 +172,15 @@ private function isInRegistry(string $key): bool
154172
return array_key_exists($key, $this->temporaryRegistry) || array_key_exists($key, $this->registry);
155173
}
156174

175+
/**
176+
* @return mixed
177+
*/
157178
private function getFromRegistry(string $key)
158179
{
159180
if (isset($this->temporaryRegistry[$key])) {
160181
return $this->temporaryRegistry[$key]($this, $this->fakerInstance);
161182
}
183+
162184
return $this->registry[$key]($this, $this->fakerInstance);
163185
}
164186
}

0 commit comments

Comments
 (0)