Skip to content

Commit 972863c

Browse files
committed
Ability to disable/enable whole vocabularies
1 parent 393c3a7 commit 972863c

14 files changed

+278
-128
lines changed

README.md

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -103,16 +103,16 @@ $schema = json_decode('{
103103
$evaluator = new \Ropi\JsonSchemaEvaluator\JsonSchemaEvaluator();
104104

105105
$staticEvaluationContext = $evaluator->evaluateStatic($schema, new \Ropi\JsonSchemaEvaluator\EvaluationConfig\StaticEvaluationConfig(
106-
defaultDraft: new \Ropi\JsonSchemaEvaluator\Draft\Draft202012()
106+
defaultDraft: new \Ropi\JsonSchemaEvaluator\Draft\Draft202012(
107+
evaluateMutations: true
108+
)
107109
));
108110

109111
$instance = (object) [
110112
'lastname' => 'Gauss'
111113
];
112114

113-
$evaluator->evaluate($instance, $staticEvaluationContext, new \Ropi\JsonSchemaEvaluator\EvaluationConfig\RuntimeEvaluationConfig(
114-
evaluateMutations: true
115-
));
115+
$evaluator->evaluate($instance, $staticEvaluationContext);
116116

117117
echo $instance->firstname; // Returns "n/a"
118118
```
@@ -129,14 +129,14 @@ $schema = json_decode('{
129129
$evaluator = new \Ropi\JsonSchemaEvaluator\JsonSchemaEvaluator();
130130

131131
$staticEvaluationContext = $evaluator->evaluateStatic($schema, new \Ropi\JsonSchemaEvaluator\EvaluationConfig\StaticEvaluationConfig(
132-
defaultDraft: new \Ropi\JsonSchemaEvaluator\Draft\Draft202012()
132+
defaultDraft: new \Ropi\JsonSchemaEvaluator\Draft\Draft202012(
133+
evaluateMutations: true
134+
)
133135
));
134136

135137
$instance = 'eyJmb28iOiAiYmFyIn0K'; // Base64 encoded JSON '{"foo": "bar"}'
136138

137-
$evaluator->evaluate($instance, $staticEvaluationContext, new \Ropi\JsonSchemaEvaluator\EvaluationConfig\RuntimeEvaluationConfig(
138-
evaluateMutations: true
139-
)); // Returns true
139+
$evaluator->evaluate($instance, $staticEvaluationContext); // Returns true
140140

141141
echo $instance; // Returns '{"foo": "bar"}'
142142
```
@@ -152,18 +152,16 @@ $schema = json_decode('{
152152
$evaluator = new \Ropi\JsonSchemaEvaluator\JsonSchemaEvaluator();
153153

154154
$staticEvaluationContext = $evaluator->evaluateStatic($schema, new \Ropi\JsonSchemaEvaluator\EvaluationConfig\StaticEvaluationConfig(
155-
defaultDraft: new \Ropi\JsonSchemaEvaluator\Draft\Draft202012()
155+
defaultDraft: new \Ropi\JsonSchemaEvaluator\Draft\Draft202012(
156+
assertContentMediaTypeEncoding: true
157+
)
156158
));
157159

158-
$runtimeEvaluationConfig = new \Ropi\JsonSchemaEvaluator\EvaluationConfig\RuntimeEvaluationConfig(
159-
assertContentMediaTypeEncoding: true
160-
);
161-
162160
$instance = '{"foo": "bar"}';
163-
$evaluator->evaluate($instance, $staticEvaluationContext, $runtimeEvaluationConfig); // Returns true
161+
$evaluator->evaluate($instance, $staticEvaluationContext); // Returns true
164162

165163
$instance2 = 'invalidJSON';
166-
$evaluator->evaluate($instance2, $staticEvaluationContext, $runtimeEvaluationConfig); // Returns false
164+
$evaluator->evaluate($instance2, $staticEvaluationContext); // Returns false
167165
```
168166

169167
## Assert format
@@ -177,13 +175,11 @@ $schema = json_decode('{
177175
$evaluator = new \Ropi\JsonSchemaEvaluator\JsonSchemaEvaluator();
178176

179177
$staticEvaluationContext = $evaluator->evaluateStatic($schema, new \Ropi\JsonSchemaEvaluator\EvaluationConfig\StaticEvaluationConfig(
180-
defaultDraft: new \Ropi\JsonSchemaEvaluator\Draft\Draft202012()
178+
defaultDraft: new \Ropi\JsonSchemaEvaluator\Draft\Draft202012(
179+
assertFormat: true
180+
)
181181
));
182182

183-
$runtimeEvaluationConfig = new \Ropi\JsonSchemaEvaluator\EvaluationConfig\RuntimeEvaluationConfig(
184-
assertFormat: true
185-
);
186-
187183
$instance = 'test@example.com';
188184
$evaluator->evaluate($instance, $staticEvaluationContext, $runtimeEvaluationConfig); // Returns true
189185

@@ -195,8 +191,10 @@ $evaluator->evaluate($instance2, $staticEvaluationContext, $runtimeEvaluationCon
195191
By default, all keywords are evaluated, even if the first keyword validation fails.
196192
If short circuiting is activated, the evaluation stops at the first negative validation result.
197193
```php
198-
$runtimeEvaluationConfig = new \Ropi\JsonSchemaEvaluator\EvaluationConfig\RuntimeEvaluationConfig(
199-
shortCircuit: true
194+
$config = new \Ropi\JsonSchemaEvaluator\EvaluationConfig\StaticEvaluationConfig(
195+
defaultDraft: new \Ropi\JsonSchemaEvaluator\Draft\Draft202012(
196+
shortCircuit: true
197+
)
200198
);
201199
```
202200

@@ -210,8 +208,9 @@ $schema = json_decode('{
210208
$evaluator = new \Ropi\JsonSchemaEvaluator\JsonSchemaEvaluator();
211209

212210
$staticEvaluationContext = $evaluator->evaluateStatic($schema, new \Ropi\JsonSchemaEvaluator\EvaluationConfig\StaticEvaluationConfig(
213-
defaultDraft: new \Ropi\JsonSchemaEvaluator\Draft\Draft202012(),
214-
acceptNumericStrings: true
211+
defaultDraft: new \Ropi\JsonSchemaEvaluator\Draft\Draft202012(
212+
acceptNumericStrings: true
213+
)
215214
));
216215

217216
$instance = json_decode('6565650699413464649797946464646464649797979', false, 512, JSON_BIGINT_AS_STRING);

src/Draft/AbstractDraft.php

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,11 @@ abstract class AbstractDraft implements DraftInterface
2525
* @var KeywordInterface[]
2626
*/
2727
private array $keywords = [];
28-
private int $lastPriority = 0;
28+
29+
/**
30+
* @var KeywordInterface[][]
31+
*/
32+
private array $keywordsByVocabulary = [];
2933

3034
/**
3135
* @var bool[]
@@ -111,7 +115,12 @@ public function enableVocabulary(string $vocabulary): void
111115
);
112116
}
113117

118+
if ($this->vocabularies[$vocabulary]) {
119+
return;
120+
}
121+
114122
$this->vocabularies[$vocabulary] = true;
123+
$this->registerKeywords();
115124
}
116125

117126
public function disableVocabulary(string $vocabulary): void
@@ -125,21 +134,34 @@ public function disableVocabulary(string $vocabulary): void
125134
);
126135
}
127136

137+
if (!$this->vocabularies[$vocabulary]) {
138+
return;
139+
}
140+
128141
$this->vocabularies[$vocabulary] = false;
142+
$this->registerKeywords();
129143
}
130144

131-
public function registerKeyword(KeywordInterface $keyword): void
145+
abstract protected function registerKeywords(): void;
146+
147+
public function registerKeyword(KeywordInterface $keyword, string $vocabulary): void
132148
{
133-
if (!$keyword->hasPriority()) {
134-
$keyword->setPriority($this->lastPriority += 1000);
149+
$this->keywordsByVocabulary[$vocabulary][$keyword->getName()] = $keyword;
150+
$this->keywords[$keyword->getName()] = $keyword;
151+
}
152+
153+
protected function unregisterKeywordByVocabulary(string $vocabulary): void
154+
{
155+
foreach ($this->keywordsByVocabulary[$vocabulary] as $keyword) {
156+
unset($this->keywords[$keyword->getName()]);
135157
}
136158

137-
$this->keywords[$keyword->getName()] = $keyword;
159+
$this->keywordsByVocabulary[$vocabulary] = [];
138160
}
139161

140162
public function getKeywordByName(string $name): KeywordInterface
141163
{
142-
return $this->keywords[$name] ?? new UnknownKeyword($name);
164+
return $this->keywords[$name] ?? new UnknownKeyword(1647650000, $name);
143165
}
144166

145167
public function schemaHasMutationKeywords(object|bool $schema): bool

0 commit comments

Comments
 (0)