Skip to content

Commit 85aa9b5

Browse files
authored
Merge pull request #78 from wol-soft/issue77_dynamicProperty
Fix creation of dynamic property for composed item validators on properties
2 parents e560d20 + 0ff4f64 commit 85aa9b5

File tree

7 files changed

+125
-13
lines changed

7 files changed

+125
-13
lines changed

phpunit.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
convertErrorsToExceptions="true"
77
convertWarningsToExceptions="true"
88
convertNoticesToExceptions="true"
9+
convertDeprecationsToExceptions="true"
910
processIsolation="false"
1011
stopOnFailure="false"
1112
bootstrap="tests/bootstrap.php"

src/Model/Validator/PropertyTemplateValidator.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ public function setScope(Schema $schema): void
5656
if (isset($this->templateValues['schema'])) {
5757
$this->templateValues['schema'] = $schema;
5858
}
59+
60+
$this->templateValues['isBaseValidator'] = in_array($this, $schema->getBaseValidators());
5961
}
6062

6163
/**

src/PropertyProcessor/ComposedValue/AbstractComposedValueProcessor.php

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,14 @@
55
namespace PHPModelGenerator\PropertyProcessor\ComposedValue;
66

77
use PHPModelGenerator\Exception\SchemaException;
8-
use PHPModelGenerator\Model\MethodInterface;
98
use PHPModelGenerator\Model\Property\CompositionPropertyDecorator;
10-
use PHPModelGenerator\Model\Property\Property;
119
use PHPModelGenerator\Model\Property\PropertyInterface;
1210
use PHPModelGenerator\Model\Property\PropertyType;
1311
use PHPModelGenerator\Model\Schema;
1412
use PHPModelGenerator\Model\SchemaDefinition\JsonSchema;
1513
use PHPModelGenerator\Model\Validator;
1614
use PHPModelGenerator\Model\Validator\ComposedPropertyValidator;
1715
use PHPModelGenerator\Model\Validator\RequiredPropertyValidator;
18-
use PHPModelGenerator\PropertyProcessor\Decorator\Property\ObjectInstantiationDecorator;
19-
use PHPModelGenerator\PropertyProcessor\Decorator\SchemaNamespaceTransferDecorator;
2016
use PHPModelGenerator\PropertyProcessor\Decorator\TypeHint\ClearTypeHintDecorator;
2117
use PHPModelGenerator\PropertyProcessor\Decorator\TypeHint\CompositionTypeHintDecorator;
2218
use PHPModelGenerator\PropertyProcessor\Property\AbstractValueProcessor;

src/Templates/Validator/ComposedItem.phptpl

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
$proposedValue = null;
1515
$modifiedValues = [];
1616

17-
{% if not generatorConfiguration.isImmutable() %}
17+
{% if viewHelper.isMutableBaseValidator(generatorConfiguration, isBaseValidator) %}
1818
$originalPropertyValidationState = $this->_propertyValidationState ?? [];
1919
{% endif %}
2020

@@ -24,7 +24,7 @@
2424

2525
{% foreach compositionProperties as compositionProperty %}
2626
try {
27-
{% if not generatorConfiguration.isImmutable() %}
27+
{% if viewHelper.isMutableBaseValidator(generatorConfiguration, isBaseValidator) %}
2828
// check if the state of the validator is already known.
2929
// If none of the properties affected by the validator are changed the validator must not be re-evaluated
3030
if (isset($validatorIndex) &&
@@ -71,7 +71,7 @@
7171
{% if generatorConfiguration.collectErrors() %}
7272
$compositionErrorCollection[] = $this->_errorRegistry;
7373

74-
{% if not generatorConfiguration.isImmutable() %}
74+
{% if viewHelper.isMutableBaseValidator(generatorConfiguration, isBaseValidator) %}
7575
if (isset($validatorIndex)) {
7676
$this->_propertyValidationState[$validatorIndex][$validatorComponentIndex] = $this->_errorRegistry;
7777
}
@@ -91,7 +91,7 @@
9191
if (is_object($value)) {
9292
$modifiedValues = array_merge($modifiedValues, $this->{{ modifiedValuesMethod }}($originalModelData, $value));
9393
}
94-
{% if not generatorConfiguration.isImmutable() %}
94+
{% if viewHelper.isMutableBaseValidator(generatorConfiguration, isBaseValidator) %}
9595
{% if not generatorConfiguration.collectErrors() %}
9696
if (isset($validatorIndex)) {
9797
$this->_propertyValidationState[$validatorIndex][$validatorComponentIndex] = true;
@@ -100,10 +100,12 @@
100100
}
101101
{% endif %}
102102
} catch (\Exception $e) {
103-
{% if not generatorConfiguration.collectErrors() %}
104-
if (isset($validatorIndex)) {
105-
$this->_propertyValidationState[$validatorIndex][$validatorComponentIndex] = false;
106-
}
103+
{% if viewHelper.isMutableBaseValidator(generatorConfiguration, isBaseValidator) %}
104+
{% if not generatorConfiguration.collectErrors() %}
105+
if (isset($validatorIndex)) {
106+
$this->_propertyValidationState[$validatorIndex][$validatorComponentIndex] = false;
107+
}
108+
{% endif %}
107109
{% endif %}
108110

109111
{% foreach compositionProperty.getAffectedObjectProperties() as affectedObjectProperty %}
@@ -137,7 +139,7 @@
137139

138140
$result = !({{ composedValueValidation }});
139141

140-
{% if not generatorConfiguration.isImmutable() %}
142+
{% if viewHelper.isMutableBaseValidator(generatorConfiguration, isBaseValidator) %}
141143
if ($result) {
142144
$this->_propertyValidationState = $originalPropertyValidationState;
143145
}

src/Utils/RenderHelper.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,11 @@ public function renderMethods(Schema $schema): string
197197
return $renderedMethods;
198198
}
199199

200+
public function isMutableBaseValidator(GeneratorConfiguration $generatorConfiguration, bool $isBaseValidator): bool
201+
{
202+
return !$generatorConfiguration->isImmutable() && $isBaseValidator;
203+
}
204+
200205
public static function varExportArray(array $values): string
201206
{
202207
return preg_replace('(\d+\s=>)', '', var_export($values, true));

tests/Issues/Issue/Issue77Test.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PHPModelGenerator\Tests\Issues\Issue;
6+
7+
use PHPModelGenerator\Model\GeneratorConfiguration;
8+
use PHPModelGenerator\Tests\Issues\AbstractIssueTest;
9+
10+
class Issue77Test extends AbstractIssueTest
11+
{
12+
public function testCompositionValidatorOnPropertyGeneratesNoDynamicProperty(): void
13+
{
14+
$className = $this->generateClassFromFile('dynamicProperty.json', (new GeneratorConfiguration())->setImmutable(false));
15+
16+
$object = new $className(['values' => [1, 10, 1000], 'pet' => ['type' => 'dog', 'age' => 0, 'name' => 'Hans']]);
17+
18+
$this->assertSame([1, 10, 1000], $object->getValues());
19+
$this->assertSame('dog', $object->getPet()->getType());
20+
$this->assertSame(0, $object->getPet()->getAge());
21+
$this->assertSame('Hans', $object->getPet()->getName());
22+
23+
$this->expectExceptionMessage('Value for item of array values must not be smaller than 1');
24+
25+
new $className(['values' => [0]]);
26+
}
27+
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
{
2+
"type": "object",
3+
"definitions": {
4+
"number": {
5+
"type": "integer",
6+
"minimum": 0,
7+
"maximum": 1000
8+
},
9+
"values": {
10+
"type": "array",
11+
"items": {
12+
"allOf": [
13+
{
14+
"$ref": "#/definitions/number"
15+
},
16+
{
17+
"type": "integer",
18+
"minimum": 1
19+
}
20+
]
21+
}
22+
},
23+
"pet": {
24+
"oneOf": [
25+
{
26+
"$ref": "#/definitions/pets/dog"
27+
},
28+
{
29+
"$ref": "#/definitions/pets/spider"
30+
}
31+
]
32+
},
33+
"pets": {
34+
"dog": {
35+
"type": "object",
36+
"$id": "dog",
37+
"properties": {
38+
"age": {
39+
"$ref": "#/definitions/number"
40+
},
41+
"name": {
42+
"type": "string"
43+
},
44+
"type": {
45+
"const": "dog"
46+
}
47+
},
48+
"required": [
49+
"type"
50+
]
51+
},
52+
"spider": {
53+
"type": "object",
54+
"properties": {
55+
"age": {
56+
"$ref": "#/definitions/number"
57+
},
58+
"weight": {
59+
"type": "number"
60+
},
61+
"type": {
62+
"const": "spider"
63+
}
64+
},
65+
"required": [
66+
"type"
67+
]
68+
}
69+
}
70+
},
71+
"properties": {
72+
"values": {
73+
"$ref": "#/definitions/values"
74+
},
75+
"pet": {
76+
"$ref": "#/definitions/pet"
77+
}
78+
}
79+
}

0 commit comments

Comments
 (0)