From 0198ede4b664ffab84ca5ea46603d56bfddaba9a Mon Sep 17 00:00:00 2001 From: Graham Esau Date: Sun, 29 Dec 2019 18:05:10 +0000 Subject: [PATCH] Add JSON Schema 2019-09 settings --- schemars/src/gen.rs | 21 +- schemars/src/schema.rs | 8 +- schemars/tests/expected/schema-2019_09.json | 745 +++++++++++++++++++ schemars/tests/expected/schema-openapi3.json | 2 +- schemars/tests/expected/schema.json | 2 +- schemars/tests/schema_for_schema.rs | 9 +- update-tests.sh | 14 + 7 files changed, 793 insertions(+), 8 deletions(-) create mode 100644 schemars/tests/expected/schema-2019_09.json create mode 100644 update-tests.sh diff --git a/schemars/src/gen.rs b/schemars/src/gen.rs index 8902d6e..5212bdb 100644 --- a/schemars/src/gen.rs +++ b/schemars/src/gen.rs @@ -29,6 +29,10 @@ pub struct SchemaSettings { /// /// Defaults to `"http://json-schema.org/draft-07/schema#"`. pub meta_schema: Option, + /// Whether schemas with a `$ref` property may have other properties set. + /// + /// Defaults to `false`. + pub allow_ref_siblings: bool, _hidden: (), } @@ -58,6 +62,20 @@ impl SchemaSettings { bool_schemas: BoolSchemas::Enabled, definitions_path: "#/definitions/".to_owned(), meta_schema: Some("http://json-schema.org/draft-07/schema#".to_owned()), + allow_ref_siblings: false, + _hidden: (), + } + } + + /// Creates `SchemaSettings` that conform to [JSON Schema 2019-09](https://json-schema.org/specification-links.html#2019-09-formerly-known-as-draft-8). + pub fn draft2019_09() -> SchemaSettings { + SchemaSettings { + option_nullable: false, + option_add_null_type: true, + bool_schemas: BoolSchemas::Enabled, + definitions_path: "#/definitions/".to_owned(), + meta_schema: Some("https://json-schema.org/draft/2019-09/schema".to_owned()), + allow_ref_siblings: true, _hidden: (), } } @@ -73,6 +91,7 @@ impl SchemaSettings { "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema" .to_owned(), ), + allow_ref_siblings: false, _hidden: (), } } @@ -173,7 +192,7 @@ impl SchemaGenerator { /// assert_eq!(extensible_schema, extensible_schema2); /// ``` pub fn make_extensible(&self, schema: SchemaObject) -> SchemaObject { - if schema.is_ref() { + if schema.is_ref() && !self.settings().allow_ref_siblings{ SchemaObject { subschemas: Some(Box::new(SubschemaValidation { all_of: Some(vec![schema.into()]), diff --git a/schemars/src/schema.rs b/schemars/src/schema.rs index bd0189a..81763aa 100644 --- a/schemars/src/schema.rs +++ b/schemars/src/schema.rs @@ -67,11 +67,13 @@ pub struct RootSchema { /// The root schema itself. #[serde(flatten)] pub schema: SchemaObject, - /// The `$defs` keyword. + /// The `definitions` keyword. /// - /// This is currently serialized as `definitions` for backwards compatibility. + /// In JSON Schema draft 2019-09 this was replaced by $defs, but in Schemars this is still + /// serialized as `definitions` for backward-compatibility. /// - /// See [JSON Schema 8.2.5. Schema Re-Use With "$defs"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-8.2.5). + /// See [JSON Schema 8.2.5. Schema Re-Use With "$defs"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-8.2.5), + /// and [JSON Schema (draft 07) 9. Schema Re-Use With "definitions"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-9). #[serde(alias = "$defs", skip_serializing_if = "Map::is_empty")] pub definitions: Map, } diff --git a/schemars/tests/expected/schema-2019_09.json b/schemars/tests/expected/schema-2019_09.json new file mode 100644 index 0000000..9b67416 --- /dev/null +++ b/schemars/tests/expected/schema-2019_09.json @@ -0,0 +1,745 @@ +{ + "$schema": "https://json-schema.org/draft/2019-09/schema", + "title": "RootSchema", + "description": "The root object of a JSON Schema document.", + "type": "object", + "properties": { + "$id": { + "description": "The `$id` keyword.\n\nSee [JSON Schema 8.2.2. The \"$id\" Keyword](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-8.2.2).", + "type": [ + "string", + "null" + ] + }, + "$ref": { + "description": "The `$ref` keyword.\n\nSee [JSON Schema 8.2.4.1. Direct References with \"$ref\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-8.2.4.1).", + "type": [ + "string", + "null" + ] + }, + "$schema": { + "description": "The `$schema` keyword.\n\nSee [JSON Schema 8.1.1. The \"$schema\" Keyword](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-8.1.1).", + "type": [ + "string", + "null" + ] + }, + "additionalItems": { + "description": "The `additionalItems` keyword.\n\nSee [JSON Schema 9.3.1.2. \"additionalItems\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.1.2).", + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "null" + } + ] + }, + "additionalProperties": { + "description": "The `additionalProperties` keyword.\n\nSee [JSON Schema 9.3.2.3. \"additionalProperties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.3).", + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "null" + } + ] + }, + "allOf": { + "description": "The `allOf` keyword.\n\nSee [JSON Schema 9.2.1.1. \"allOf\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.1.1).", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Schema" + } + }, + "anyOf": { + "description": "The `anyOf` keyword.\n\nSee [JSON Schema 9.2.1.2. \"anyOf\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.1.2).", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Schema" + } + }, + "const": { + "description": "The `const` keyword.\n\nSee [JSON Schema Validation 6.1.3. \"const\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.1.3)" + }, + "contains": { + "description": "The `contains` keyword.\n\nSee [JSON Schema 9.3.1.4. \"contains\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.1.4).", + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "null" + } + ] + }, + "default": { + "description": "The `default` keyword.\n\nSee [JSON Schema Validation 9.2. \"default\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.2)." + }, + "definitions": { + "description": "The `definitions` keyword.\n\nIn JSON Schema draft 2019-09 this was replaced by $defs, but in Schemars this is still serialized as `definitions` for backward-compatibility.\n\nSee [JSON Schema 8.2.5. Schema Re-Use With \"$defs\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-8.2.5), and [JSON Schema (draft 07) 9. Schema Re-Use With \"definitions\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-9).", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Schema" + } + }, + "deprecated": { + "description": "The `deprecated` keyword.\n\nSee [JSON Schema Validation 9.3. \"deprecated\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.3).", + "type": "boolean" + }, + "description": { + "description": "The `description` keyword.\n\nSee [JSON Schema Validation 9.1. \"title\" and \"description\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.1).", + "type": [ + "string", + "null" + ] + }, + "else": { + "description": "The `else` keyword.\n\nSee [JSON Schema 9.2.2.3. \"else\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.2.3).", + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "null" + } + ] + }, + "enum": { + "description": "The `enum` keyword.\n\nSee [JSON Schema Validation 6.1.2. \"enum\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.1.2)", + "type": [ + "array", + "null" + ], + "items": true + }, + "exclusiveMaximum": { + "description": "The `exclusiveMaximum` keyword.\n\nSee [JSON Schema Validation 6.2.3. \"exclusiveMaximum\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.2.3).", + "type": [ + "number", + "null" + ], + "format": "double" + }, + "exclusiveMinimum": { + "description": "The `exclusiveMinimum` keyword.\n\nSee [JSON Schema Validation 6.2.5. \"exclusiveMinimum\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.2.5).", + "type": [ + "number", + "null" + ], + "format": "double" + }, + "format": { + "description": "The `format` keyword.\n\nSee [JSON Schema Validation 7. A Vocabulary for Semantic Content With \"format\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-7).", + "type": [ + "string", + "null" + ] + }, + "if": { + "description": "The `if` keyword.\n\nSee [JSON Schema 9.2.2.1. \"if\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.2.1).", + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "null" + } + ] + }, + "items": { + "description": "The `items` keyword.\n\nSee [JSON Schema 9.3.1.1. \"items\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.1.1).", + "anyOf": [ + { + "$ref": "#/definitions/SingleOrVec_for_Schema" + }, + { + "type": "null" + } + ] + }, + "maxItems": { + "description": "The `maxItems` keyword.\n\nSee [JSON Schema Validation 6.4.1. \"maxItems\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.4.1).", + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "maxLength": { + "description": "The `maxLength` keyword.\n\nSee [JSON Schema Validation 6.3.1. \"maxLength\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.3.1).", + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "maxProperties": { + "description": "The `maxProperties` keyword.\n\nSee [JSON Schema Validation 6.5.1. \"maxProperties\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.5.1).", + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "maximum": { + "description": "The `maximum` keyword.\n\nSee [JSON Schema Validation 6.2.2. \"maximum\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.2.2).", + "type": [ + "number", + "null" + ], + "format": "double" + }, + "minItems": { + "description": "The `minItems` keyword.\n\nSee [JSON Schema Validation 6.4.2. \"minItems\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.4.2).", + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "minLength": { + "description": "The `minLength` keyword.\n\nSee [JSON Schema Validation 6.3.2. \"minLength\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.3.2).", + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "minProperties": { + "description": "The `minProperties` keyword.\n\nSee [JSON Schema Validation 6.5.2. \"minProperties\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.5.2).", + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "minimum": { + "description": "The `minimum` keyword.\n\nSee [JSON Schema Validation 6.2.4. \"minimum\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.2.4).", + "type": [ + "number", + "null" + ], + "format": "double" + }, + "multipleOf": { + "description": "The `multipleOf` keyword.\n\nSee [JSON Schema Validation 6.2.1. \"multipleOf\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.2.1).", + "type": [ + "number", + "null" + ], + "format": "double" + }, + "not": { + "description": "The `not` keyword.\n\nSee [JSON Schema 9.2.1.4. \"not\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.1.4).", + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "null" + } + ] + }, + "oneOf": { + "description": "The `oneOf` keyword.\n\nSee [JSON Schema 9.2.1.3. \"oneOf\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.1.3).", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Schema" + } + }, + "pattern": { + "description": "The `pattern` keyword.\n\nSee [JSON Schema Validation 6.3.3. \"pattern\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.3.3).", + "type": [ + "string", + "null" + ] + }, + "patternProperties": { + "description": "The `patternProperties` keyword.\n\nSee [JSON Schema 9.3.2.2. \"patternProperties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.2).", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Schema" + } + }, + "properties": { + "description": "The `properties` keyword.\n\nSee [JSON Schema 9.3.2.1. \"properties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.1).", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Schema" + } + }, + "propertyNames": { + "description": "The `propertyNames` keyword.\n\nSee [JSON Schema 9.3.2.5. \"propertyNames\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.5).", + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "null" + } + ] + }, + "readOnly": { + "description": "The `readOnly` keyword.\n\nSee [JSON Schema Validation 9.4. \"readOnly\" and \"writeOnly\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.4).", + "type": "boolean" + }, + "required": { + "description": "The `required` keyword.\n\nSee [JSON Schema Validation 6.5.3. \"required\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.5.3).", + "type": "array", + "items": { + "type": "string" + } + }, + "then": { + "description": "The `then` keyword.\n\nSee [JSON Schema 9.2.2.2. \"then\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.2.2).", + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "null" + } + ] + }, + "title": { + "description": "The `title` keyword.\n\nSee [JSON Schema Validation 9.1. \"title\" and \"description\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.1).", + "type": [ + "string", + "null" + ] + }, + "type": { + "description": "The `type` keyword.\n\nSee [JSON Schema Validation 6.1.1. \"type\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.1.1) and [JSON Schema 4.2.1. Instance Data Model](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-4.2.1).", + "anyOf": [ + { + "$ref": "#/definitions/SingleOrVec_for_InstanceType" + }, + { + "type": "null" + } + ] + }, + "uniqueItems": { + "description": "The `uniqueItems` keyword.\n\nSee [JSON Schema Validation 6.4.3. \"uniqueItems\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.4.3).", + "type": [ + "boolean", + "null" + ] + }, + "writeOnly": { + "description": "The `writeOnly` keyword.\n\nSee [JSON Schema Validation 9.4. \"readOnly\" and \"writeOnly\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.4).", + "type": "boolean" + } + }, + "additionalProperties": true, + "definitions": { + "InstanceType": { + "description": "The possible types of values in JSON Schema documents.\n\nSee [JSON Schema 4.2.1. Instance Data Model](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-4.2.1).", + "enum": [ + "null", + "boolean", + "object", + "array", + "number", + "string", + "integer" + ] + }, + "Schema": { + "description": "A JSON Schema.", + "anyOf": [ + { + "description": "A trivial boolean JSON Schema.\n\nThe schema `true` matches everything (always passes validation), whereas the schema `false` matches nothing (always fails validation).", + "type": "boolean" + }, + { + "description": "A JSON Schema object.", + "$ref": "#/definitions/SchemaObject" + } + ] + }, + "SchemaObject": { + "description": "A JSON Schema object.", + "type": "object", + "properties": { + "$id": { + "description": "The `$id` keyword.\n\nSee [JSON Schema 8.2.2. The \"$id\" Keyword](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-8.2.2).", + "type": [ + "string", + "null" + ] + }, + "$ref": { + "description": "The `$ref` keyword.\n\nSee [JSON Schema 8.2.4.1. Direct References with \"$ref\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-8.2.4.1).", + "type": [ + "string", + "null" + ] + }, + "additionalItems": { + "description": "The `additionalItems` keyword.\n\nSee [JSON Schema 9.3.1.2. \"additionalItems\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.1.2).", + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "null" + } + ] + }, + "additionalProperties": { + "description": "The `additionalProperties` keyword.\n\nSee [JSON Schema 9.3.2.3. \"additionalProperties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.3).", + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "null" + } + ] + }, + "allOf": { + "description": "The `allOf` keyword.\n\nSee [JSON Schema 9.2.1.1. \"allOf\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.1.1).", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Schema" + } + }, + "anyOf": { + "description": "The `anyOf` keyword.\n\nSee [JSON Schema 9.2.1.2. \"anyOf\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.1.2).", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Schema" + } + }, + "const": { + "description": "The `const` keyword.\n\nSee [JSON Schema Validation 6.1.3. \"const\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.1.3)" + }, + "contains": { + "description": "The `contains` keyword.\n\nSee [JSON Schema 9.3.1.4. \"contains\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.1.4).", + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "null" + } + ] + }, + "default": { + "description": "The `default` keyword.\n\nSee [JSON Schema Validation 9.2. \"default\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.2)." + }, + "deprecated": { + "description": "The `deprecated` keyword.\n\nSee [JSON Schema Validation 9.3. \"deprecated\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.3).", + "type": "boolean" + }, + "description": { + "description": "The `description` keyword.\n\nSee [JSON Schema Validation 9.1. \"title\" and \"description\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.1).", + "type": [ + "string", + "null" + ] + }, + "else": { + "description": "The `else` keyword.\n\nSee [JSON Schema 9.2.2.3. \"else\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.2.3).", + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "null" + } + ] + }, + "enum": { + "description": "The `enum` keyword.\n\nSee [JSON Schema Validation 6.1.2. \"enum\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.1.2)", + "type": [ + "array", + "null" + ], + "items": true + }, + "exclusiveMaximum": { + "description": "The `exclusiveMaximum` keyword.\n\nSee [JSON Schema Validation 6.2.3. \"exclusiveMaximum\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.2.3).", + "type": [ + "number", + "null" + ], + "format": "double" + }, + "exclusiveMinimum": { + "description": "The `exclusiveMinimum` keyword.\n\nSee [JSON Schema Validation 6.2.5. \"exclusiveMinimum\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.2.5).", + "type": [ + "number", + "null" + ], + "format": "double" + }, + "format": { + "description": "The `format` keyword.\n\nSee [JSON Schema Validation 7. A Vocabulary for Semantic Content With \"format\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-7).", + "type": [ + "string", + "null" + ] + }, + "if": { + "description": "The `if` keyword.\n\nSee [JSON Schema 9.2.2.1. \"if\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.2.1).", + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "null" + } + ] + }, + "items": { + "description": "The `items` keyword.\n\nSee [JSON Schema 9.3.1.1. \"items\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.1.1).", + "anyOf": [ + { + "$ref": "#/definitions/SingleOrVec_for_Schema" + }, + { + "type": "null" + } + ] + }, + "maxItems": { + "description": "The `maxItems` keyword.\n\nSee [JSON Schema Validation 6.4.1. \"maxItems\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.4.1).", + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "maxLength": { + "description": "The `maxLength` keyword.\n\nSee [JSON Schema Validation 6.3.1. \"maxLength\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.3.1).", + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "maxProperties": { + "description": "The `maxProperties` keyword.\n\nSee [JSON Schema Validation 6.5.1. \"maxProperties\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.5.1).", + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "maximum": { + "description": "The `maximum` keyword.\n\nSee [JSON Schema Validation 6.2.2. \"maximum\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.2.2).", + "type": [ + "number", + "null" + ], + "format": "double" + }, + "minItems": { + "description": "The `minItems` keyword.\n\nSee [JSON Schema Validation 6.4.2. \"minItems\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.4.2).", + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "minLength": { + "description": "The `minLength` keyword.\n\nSee [JSON Schema Validation 6.3.2. \"minLength\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.3.2).", + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "minProperties": { + "description": "The `minProperties` keyword.\n\nSee [JSON Schema Validation 6.5.2. \"minProperties\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.5.2).", + "type": [ + "integer", + "null" + ], + "format": "uint32", + "minimum": 0.0 + }, + "minimum": { + "description": "The `minimum` keyword.\n\nSee [JSON Schema Validation 6.2.4. \"minimum\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.2.4).", + "type": [ + "number", + "null" + ], + "format": "double" + }, + "multipleOf": { + "description": "The `multipleOf` keyword.\n\nSee [JSON Schema Validation 6.2.1. \"multipleOf\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.2.1).", + "type": [ + "number", + "null" + ], + "format": "double" + }, + "not": { + "description": "The `not` keyword.\n\nSee [JSON Schema 9.2.1.4. \"not\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.1.4).", + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "null" + } + ] + }, + "oneOf": { + "description": "The `oneOf` keyword.\n\nSee [JSON Schema 9.2.1.3. \"oneOf\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.1.3).", + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/definitions/Schema" + } + }, + "pattern": { + "description": "The `pattern` keyword.\n\nSee [JSON Schema Validation 6.3.3. \"pattern\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.3.3).", + "type": [ + "string", + "null" + ] + }, + "patternProperties": { + "description": "The `patternProperties` keyword.\n\nSee [JSON Schema 9.3.2.2. \"patternProperties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.2).", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Schema" + } + }, + "properties": { + "description": "The `properties` keyword.\n\nSee [JSON Schema 9.3.2.1. \"properties\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.1).", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Schema" + } + }, + "propertyNames": { + "description": "The `propertyNames` keyword.\n\nSee [JSON Schema 9.3.2.5. \"propertyNames\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.3.2.5).", + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "null" + } + ] + }, + "readOnly": { + "description": "The `readOnly` keyword.\n\nSee [JSON Schema Validation 9.4. \"readOnly\" and \"writeOnly\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.4).", + "type": "boolean" + }, + "required": { + "description": "The `required` keyword.\n\nSee [JSON Schema Validation 6.5.3. \"required\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.5.3).", + "type": "array", + "items": { + "type": "string" + } + }, + "then": { + "description": "The `then` keyword.\n\nSee [JSON Schema 9.2.2.2. \"then\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-9.2.2.2).", + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "null" + } + ] + }, + "title": { + "description": "The `title` keyword.\n\nSee [JSON Schema Validation 9.1. \"title\" and \"description\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.1).", + "type": [ + "string", + "null" + ] + }, + "type": { + "description": "The `type` keyword.\n\nSee [JSON Schema Validation 6.1.1. \"type\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.1.1) and [JSON Schema 4.2.1. Instance Data Model](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-4.2.1).", + "anyOf": [ + { + "$ref": "#/definitions/SingleOrVec_for_InstanceType" + }, + { + "type": "null" + } + ] + }, + "uniqueItems": { + "description": "The `uniqueItems` keyword.\n\nSee [JSON Schema Validation 6.4.3. \"uniqueItems\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-6.4.3).", + "type": [ + "boolean", + "null" + ] + }, + "writeOnly": { + "description": "The `writeOnly` keyword.\n\nSee [JSON Schema Validation 9.4. \"readOnly\" and \"writeOnly\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.4).", + "type": "boolean" + } + }, + "additionalProperties": true + }, + "SingleOrVec_for_InstanceType": { + "description": "A type which can be serialized as a single item, or multiple items.\n\nIn some contexts, a `Single` may be semantically distinct from a `Vec` containing only item.", + "anyOf": [ + { + "$ref": "#/definitions/InstanceType" + }, + { + "type": "array", + "items": { + "$ref": "#/definitions/InstanceType" + } + } + ] + }, + "SingleOrVec_for_Schema": { + "description": "A type which can be serialized as a single item, or multiple items.\n\nIn some contexts, a `Single` may be semantically distinct from a `Vec` containing only item.", + "anyOf": [ + { + "$ref": "#/definitions/Schema" + }, + { + "type": "array", + "items": { + "$ref": "#/definitions/Schema" + } + } + ] + } + } +} \ No newline at end of file diff --git a/schemars/tests/expected/schema-openapi3.json b/schemars/tests/expected/schema-openapi3.json index 7833836..c1223c0 100644 --- a/schemars/tests/expected/schema-openapi3.json +++ b/schemars/tests/expected/schema-openapi3.json @@ -71,7 +71,7 @@ "nullable": true }, "definitions": { - "description": "The `$defs` keyword.\n\nThis is currently serialized as `definitions` for backwards compatibility.\n\nSee [JSON Schema 8.2.5. Schema Re-Use With \"$defs\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-8.2.5).", + "description": "The `definitions` keyword.\n\nIn JSON Schema draft 2019-09 this was replaced by $defs, but in Schemars this is still serialized as `definitions` for backward-compatibility.\n\nSee [JSON Schema 8.2.5. Schema Re-Use With \"$defs\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-8.2.5), and [JSON Schema (draft 07) 9. Schema Re-Use With \"definitions\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-9).", "type": "object", "additionalProperties": { "$ref": "#/components/schemas/Schema" diff --git a/schemars/tests/expected/schema.json b/schemars/tests/expected/schema.json index 4982d5a..012ada0 100644 --- a/schemars/tests/expected/schema.json +++ b/schemars/tests/expected/schema.json @@ -85,7 +85,7 @@ "description": "The `default` keyword.\n\nSee [JSON Schema Validation 9.2. \"default\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-02#section-9.2)." }, "definitions": { - "description": "The `$defs` keyword.\n\nThis is currently serialized as `definitions` for backwards compatibility.\n\nSee [JSON Schema 8.2.5. Schema Re-Use With \"$defs\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-8.2.5).", + "description": "The `definitions` keyword.\n\nIn JSON Schema draft 2019-09 this was replaced by $defs, but in Schemars this is still serialized as `definitions` for backward-compatibility.\n\nSee [JSON Schema 8.2.5. Schema Re-Use With \"$defs\"](https://tools.ietf.org/html/draft-handrews-json-schema-02#section-8.2.5), and [JSON Schema (draft 07) 9. Schema Re-Use With \"definitions\"](https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-9).", "type": "object", "additionalProperties": { "$ref": "#/definitions/Schema" diff --git a/schemars/tests/schema_for_schema.rs b/schemars/tests/schema_for_schema.rs index 0e2debb..d175505 100644 --- a/schemars/tests/schema_for_schema.rs +++ b/schemars/tests/schema_for_schema.rs @@ -4,8 +4,13 @@ use schemars::schema::RootSchema; use util::*; #[test] -fn schema_matches_default_settings() -> TestResult { - test_default_generated_schema::("schema") +fn schema_matches_draft07() -> TestResult { + test_generated_schema::("schema", SchemaSettings::draft07()) +} + +#[test] +fn schema_matches_2019_09() -> TestResult { + test_generated_schema::("schema-2019_09", SchemaSettings::draft2019_09()) } #[test] diff --git a/update-tests.sh b/update-tests.sh new file mode 100644 index 0000000..476531f --- /dev/null +++ b/update-tests.sh @@ -0,0 +1,14 @@ +#!/bin/bash +set -euxo pipefail + +cd schemars + +rm -f tests/actual/*.json + +cargo test --all-features --no-fail-fast --tests || : + +if ls tests/actual/*.json 1> /dev/null 2>&1; then + mv -f tests/actual/*.json tests/expected/ +else + echo "Test schemas are up-to-date." +fi