Skip to content

Commit 7efd6ad

Browse files
authored
Add unevaluatedProperties and unevaluatedItems (#7)
1 parent ab35383 commit 7efd6ad

File tree

6 files changed

+120
-0
lines changed

6 files changed

+120
-0
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace JsonSchema\Keyword;
6+
7+
use JsonSchema\Schema\SchemaInterface;
8+
use Webmozart\Assert\Assert;
9+
10+
class UnevaluatedItemsKeyword extends AbstractKeyword
11+
{
12+
const NAME = 'unevaluatedItems';
13+
14+
/**
15+
* @param bool|SchemaInterface|null $unevaluatedItems
16+
*/
17+
public function __construct($unevaluatedItems)
18+
{
19+
if (null === $unevaluatedItems || \is_bool($unevaluatedItems)) {
20+
parent::__construct(static::NAME, $unevaluatedItems);
21+
22+
return;
23+
}
24+
25+
Assert::isInstanceOf($unevaluatedItems, SchemaInterface::class);
26+
27+
parent::__construct(static::NAME, $unevaluatedItems->toJsonSchema());
28+
}
29+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace JsonSchema\Keyword;
6+
7+
use JsonSchema\Schema\SchemaInterface;
8+
use Webmozart\Assert\Assert;
9+
10+
class UnevaluatedPropertiesKeyword extends AbstractKeyword
11+
{
12+
const NAME = 'unevaluatedProperties';
13+
14+
/**
15+
* @param bool|SchemaInterface|null $unevaluatedProperties
16+
*/
17+
public function __construct($unevaluatedProperties)
18+
{
19+
if (null === $unevaluatedProperties || \is_bool($unevaluatedProperties)) {
20+
parent::__construct(static::NAME, $unevaluatedProperties);
21+
22+
return;
23+
}
24+
25+
Assert::isInstanceOf($unevaluatedProperties, SchemaInterface::class);
26+
27+
parent::__construct(static::NAME, $unevaluatedProperties->toJsonSchema());
28+
}
29+
}

src/Schema/ArraySchema.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use JsonSchema\Keyword\MinContainsKeyword;
1111
use JsonSchema\Keyword\MinItemsKeyword;
1212
use JsonSchema\Keyword\TypeKeyword;
13+
use JsonSchema\Keyword\UnevaluatedItemsKeyword;
1314
use JsonSchema\Keyword\UniqueItemsKeyword;
1415

1516
class ArraySchema extends AbstractSchema
@@ -71,6 +72,18 @@ public function additionalItems($additionalItems): self
7172
);
7273
}
7374

75+
/**
76+
* @param bool|SchemaInterface|null $unevaluatedItems
77+
*
78+
* @return static
79+
*/
80+
public function unevaluatedItems($unevaluatedItems): self
81+
{
82+
return $this->with(
83+
new UnevaluatedItemsKeyword($unevaluatedItems)
84+
);
85+
}
86+
7487
/**
7588
* @return static
7689
*/

src/Schema/ObjectSchema.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use JsonSchema\Keyword\PropertyNamesKeyword;
1212
use JsonSchema\Keyword\RequiredKeyword;
1313
use JsonSchema\Keyword\TypeKeyword;
14+
use JsonSchema\Keyword\UnevaluatedPropertiesKeyword;
1415
use JsonSchema\Property\PropertyInterface;
1516

1617
class ObjectSchema extends AbstractSchema
@@ -64,6 +65,18 @@ public function additionalProperties($additionalProperties): self
6465
);
6566
}
6667

68+
/**
69+
* @param bool|SchemaInterface|null $unevaluatedProperties
70+
*
71+
* @return static
72+
*/
73+
public function unevaluatedProperties($unevaluatedProperties): self
74+
{
75+
return $this->with(
76+
new UnevaluatedPropertiesKeyword($unevaluatedProperties)
77+
);
78+
}
79+
6780
/**
6881
* @return static
6982
*/

tests/Unit/Schema/ArraySchemaTest.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,24 @@ public function testAdditionalItems(): void
9292
static::assertEquals((object) ['type' => 'array'], $schema5->toJsonSchema());
9393
}
9494

95+
public function testUnevaluatedItems(): void
96+
{
97+
$unevaluatedItemsJsonSchema = (object) ['foo' => 'bar'];
98+
$unevaluatedItemsSchema = $this->mockSchema($unevaluatedItemsJsonSchema);
99+
100+
$schema1 = new ArraySchema();
101+
$schema2 = $schema1->unevaluatedItems($unevaluatedItemsSchema->reveal());
102+
$schema3 = $schema2->unevaluatedItems(true);
103+
$schema4 = $schema3->unevaluatedItems(false);
104+
$schema5 = $schema4->unevaluatedItems(null);
105+
106+
static::assertEquals((object) ['type' => 'array'], $schema1->toJsonSchema());
107+
static::assertEquals((object) ['type' => 'array', 'unevaluatedItems' => $unevaluatedItemsJsonSchema], $schema2->toJsonSchema());
108+
static::assertEquals((object) ['type' => 'array', 'unevaluatedItems' => true], $schema3->toJsonSchema());
109+
static::assertEquals((object) ['type' => 'array', 'unevaluatedItems' => false], $schema4->toJsonSchema());
110+
static::assertEquals((object) ['type' => 'array'], $schema5->toJsonSchema());
111+
}
112+
95113
public function testMinItems(): void
96114
{
97115
$schema1 = new ArraySchema();

tests/Unit/Schema/ObjectSchemaTest.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,24 @@ public function testAdditionalProperties(): void
164164
static::assertEquals((object) ['type' => 'object'], $schema5->toJsonSchema());
165165
}
166166

167+
public function testUnevaluatedProperties(): void
168+
{
169+
$unevaluatedPropertiesJsonSchema = (object) ['foo' => 'bar'];
170+
$unevaluatedPropertiesSchema = $this->mockSchema($unevaluatedPropertiesJsonSchema);
171+
172+
$schema1 = new ObjectSchema();
173+
$schema2 = $schema1->unevaluatedProperties($unevaluatedPropertiesSchema->reveal());
174+
$schema3 = $schema2->unevaluatedProperties(true);
175+
$schema4 = $schema3->unevaluatedProperties(false);
176+
$schema5 = $schema4->unevaluatedProperties(null);
177+
178+
static::assertEquals((object) ['type' => 'object'], $schema1->toJsonSchema());
179+
static::assertEquals((object) ['type' => 'object', 'unevaluatedProperties' => $unevaluatedPropertiesJsonSchema], $schema2->toJsonSchema());
180+
static::assertEquals((object) ['type' => 'object', 'unevaluatedProperties' => true], $schema3->toJsonSchema());
181+
static::assertEquals((object) ['type' => 'object', 'unevaluatedProperties' => false], $schema4->toJsonSchema());
182+
static::assertEquals((object) ['type' => 'object'], $schema5->toJsonSchema());
183+
}
184+
167185
public function testMinProperties(): void
168186
{
169187
$schema1 = new ObjectSchema();

0 commit comments

Comments
 (0)