1
0
Fork 0

Allow optional name and description fields for project type

pull/9782/head
BoShurik 2021-03-16 15:33:49 +03:00
parent b6826f3523
commit cc55b56dd7
3 changed files with 40 additions and 4 deletions

View File

@ -3,7 +3,26 @@
"name": "Package", "name": "Package",
"type": "object", "type": "object",
"additionalProperties": false, "additionalProperties": false,
"required": [ "name", "description" ], "oneOf": [
{
"properties": {
"type": {
"not": {
"enum": ["project"]
}
}
},
"required": ["name", "description"]
},
{
"properties": {
"type": {
"enum": ["project"]
}
},
"required": ["type"]
}
],
"properties": { "properties": {
"name": { "name": {
"type": "string", "type": "string",

View File

@ -198,7 +198,7 @@ class JsonFile
if ($schema === self::LAX_SCHEMA) { if ($schema === self::LAX_SCHEMA) {
$schemaData->additionalProperties = true; $schemaData->additionalProperties = true;
$schemaData->required = array(); $schemaData->oneOf = null;
} }
$validator = new Validator(); $validator = new Validator();

View File

@ -41,18 +41,35 @@ class ComposerSchemaTest extends TestCase
{ {
$json = '{ }'; $json = '{ }';
$result = $this->check($json); $result = $this->check($json);
$this->assertContains(array('property' => 'name', 'message' => 'The property name is required', 'constraint' => 'required'), $result); $this->assertContains(array('property' => 'type', 'message' => 'The property type is required', 'constraint' => 'required'), $result);
$this->assertContains(array('property' => 'description', 'message' => 'The property description is required', 'constraint' => 'required'), $result);
$json = '{ "name": "vendor/package" }'; $json = '{ "name": "vendor/package" }';
$this->assertEquals(array( $this->assertEquals(array(
array('property' => 'type', 'message' => 'The property type is required', 'constraint' => 'required'),
array('property' => 'description', 'message' => 'The property description is required', 'constraint' => 'required'), array('property' => 'description', 'message' => 'The property description is required', 'constraint' => 'required'),
array('property' => '', 'message' => 'Failed to match exactly one schema', 'constraint' => 'oneOf'),
), $this->check($json)); ), $this->check($json));
$json = '{ "description": "generic description" }'; $json = '{ "description": "generic description" }';
$this->assertEquals(array( $this->assertEquals(array(
array('property' => 'type', 'message' => 'The property type is required', 'constraint' => 'required'),
array('property' => 'name', 'message' => 'The property name is required', 'constraint' => 'required'), array('property' => 'name', 'message' => 'The property name is required', 'constraint' => 'required'),
array('property' => '', 'message' => 'Failed to match exactly one schema', 'constraint' => 'oneOf'),
), $this->check($json)); ), $this->check($json));
$json = '{ "type": "library" }';
$this->assertEquals(array(
array('property' => 'type', 'message' => 'Does not have a value in the enumeration ["project"]', 'constraint' => 'enum', 'enum' => array('project')),
array('property' => 'name', 'message' => 'The property name is required', 'constraint' => 'required'),
array('property' => 'description', 'message' => 'The property description is required', 'constraint' => 'required'),
array('property' => '', 'message' => 'Failed to match exactly one schema', 'constraint' => 'oneOf'),
), $this->check($json));
$json = '{ "type": "project" }';
$this->assertTrue($this->check($json));
$json = '{ "name": "vendor/package", "description": "description" }';
$this->assertTrue($this->check($json));
} }
public function testOptionalAbandonedProperty() public function testOptionalAbandonedProperty()