Skip to content

Commit 588af2c

Browse files
committed
feat: allow detection of schema version
1 parent 0e09c07 commit 588af2c

File tree

6 files changed

+75
-6
lines changed

6 files changed

+75
-6
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
- `uri` format is now validated.
1313
- Support for Swift 4 and 5.
14+
- Added support for JSON Schema Draft 6 and 7.
1415

1516
### Bug Fixes
1617

Sources/Draft4Validator.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import Foundation
22

33
public class Draft4Validator: Validator {
44
let schema: [String: Any]
5-
let metaSchema: [String: Any] = DRAFT_04_META_SCHEMA
5+
static let metaSchema: [String: Any] = DRAFT_04_META_SCHEMA
66
let resolver: RefResolver
77

88
typealias Validation = (Validator, Any, Any, [String: Any]) -> (ValidationResult)

Sources/Draft7Validator.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import Foundation
22

33
public class Draft7Validator: Validator {
44
let schema: [String: Any]
5-
let metaSchema: [String: Any] = DRAFT_07_META_SCHEMA
5+
static let metaSchema: [String: Any] = DRAFT_07_META_SCHEMA
66
let resolver: RefResolver
77

88
typealias Validation = (Validator, Any, Any, [String: Any]) -> (ValidationResult)

Sources/JSONSchema.swift

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public struct Schema {
5252
}
5353

5454
public func validate(_ data: Any) -> ValidationResult {
55-
let validator = Draft4Validator(schema: schema)
55+
let validator = JSONSchema.validator(for: schema)
5656
return validator.validate(instance: data)
5757
}
5858
}
@@ -67,9 +67,29 @@ func validatorCurry(_ validator: @escaping (Draft4Validator, Any, Any, [String:
6767
}
6868

6969

70+
func validator(for schema: [String: Any]) -> Validator {
71+
guard let schemaURI = schema["$schema"] as? String else {
72+
return Draft4Validator(schema: schema)
73+
}
74+
75+
if let id = Draft7Validator.metaSchema["$id"] as? String, schemaURI == id {
76+
return Draft7Validator(schema: schema)
77+
}
78+
79+
if let id = Draft6Validator.metaSchema["$id"] as? String, schemaURI == id {
80+
return Draft6Validator(schema: schema)
81+
}
82+
83+
if let id = Draft4Validator.metaSchema["$id"] as? String, schemaURI == id {
84+
return Draft4Validator(schema: schema)
85+
}
86+
87+
return Draft4Validator(schema: schema)
88+
}
89+
90+
7091
public func validate(_ value: Any, schema: [String: Any]) -> ValidationResult {
71-
let validator = Draft4Validator(schema: schema)
72-
return validator.validate(instance: value)
92+
return validator(for: schema).validate(instance: value)
7393
}
7494

7595

Tests/JSONSchemaTests/JSONSchemaCases.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ func draft4Validator(schema: Any, instance: Any) -> ValidationResult {
1717
}
1818

1919
if let schema = schema as? [String: Any] {
20-
return Draft4Validator(schema: schema).validate(instance: instance)
20+
return validate(instance, schema: schema)
2121
}
2222

2323
fatalError()

Tests/JSONSchemaTests/JSONSchemaTests.swift

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,51 @@ class JSONSchemaTests: XCTestCase {
5050
XCTAssertFalse(schema.validate(["price": 34.99]).valid)
5151
}
5252
}
53+
54+
55+
class ValidateTests: XCTestCase {
56+
func testValidateDraft4() {
57+
let schema: [String: Any] = [
58+
"$schema": "http://json-schema.org/draft-04/schema#",
59+
"type": "object",
60+
"properties": [
61+
"name": ["type": "string"],
62+
"price": ["type": "number"],
63+
],
64+
"required": ["name"],
65+
]
66+
67+
XCTAssertTrue(validate(["name": "Eggs", "price": 34.99], schema: schema).valid)
68+
XCTAssertFalse(validate(["price": 34.99], schema: schema).valid)
69+
}
70+
71+
func testValidateDraft6() {
72+
let schema: [String: Any] = [
73+
"$schema": "http://json-schema.org/draft-06/schema#",
74+
"type": "object",
75+
"properties": [
76+
"name": ["type": "string"],
77+
"price": ["type": "number"],
78+
],
79+
"required": ["name"],
80+
]
81+
82+
XCTAssertTrue(validate(["name": "Eggs", "price": 34.99], schema: schema).valid)
83+
XCTAssertFalse(validate(["price": 34.99], schema: schema).valid)
84+
}
85+
86+
func testValidateDraft7() {
87+
let schema: [String: Any] = [
88+
"$schema": "http://json-schema.org/draft-07/schema#",
89+
"type": "object",
90+
"properties": [
91+
"name": ["type": "string"],
92+
"price": ["type": "number"],
93+
],
94+
"required": ["name"],
95+
]
96+
97+
XCTAssertTrue(validate(["name": "Eggs", "price": 34.99], schema: schema).valid)
98+
XCTAssertFalse(validate(["price": 34.99], schema: schema).valid)
99+
}
100+
}

0 commit comments

Comments
 (0)