From 743eff9476ca16e69da2bc43b0d355fd0c699de4 Mon Sep 17 00:00:00 2001 From: Martin Zagora Date: Mon, 30 Mar 2015 09:18:34 +1100 Subject: [PATCH] bundle default json-schemas together with z-schema, fixes #99 --- .gitmodules | 3 + Gruntfile.js | 18 +++- json-schema | 1 + src/ZSchema.js | 5 + src/schemas/hyper-schema.json | 158 ++++++++++++++++++++++++++++++ src/schemas/schema.json | 150 ++++++++++++++++++++++++++++ test/spec/ZSchemaTestSuiteSpec.js | 3 +- 7 files changed, 335 insertions(+), 3 deletions(-) create mode 160000 json-schema create mode 100644 src/schemas/hyper-schema.json create mode 100644 src/schemas/schema.json diff --git a/.gitmodules b/.gitmodules index f0854ef..6baa9a0 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "test/jsonSchemaTestSuite"] path = test/jsonSchemaTestSuite url = https://github.com/json-schema/JSON-Schema-Test-Suite.git +[submodule "json-schema"] + path = json-schema + url = https://github.com/json-schema/json-schema.git diff --git a/Gruntfile.js b/Gruntfile.js index 44bed2c..cd49022 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1,12 +1,27 @@ /*global require,module*/ var remapify = require("remapify"); +var path = require("path"); module.exports = function (grunt) { // Project configuration. grunt.initConfig({ pkg: grunt.file.readJSON("package.json"), + copy: { + dist: { + files: [{ + expand: true, + dot: true, + cwd: ".", + dest: "src/schemas/", + src: ["./json-schema/draft-04/*"], + rename: function(dest, src) { + return dest + path.basename(src) + ".json"; + } + }] + } + }, lineending: { dist: { options: { @@ -87,6 +102,7 @@ module.exports = function (grunt) { // Load the plugin that provides the "uglify" task. grunt.loadNpmTasks("grunt-lineending"); grunt.loadNpmTasks("grunt-contrib-jshint"); + grunt.loadNpmTasks("grunt-contrib-copy"); grunt.loadNpmTasks("grunt-jscs"); grunt.loadNpmTasks("grunt-jasmine-node"); grunt.loadNpmTasks("grunt-jasmine-node-coverage"); @@ -95,7 +111,7 @@ module.exports = function (grunt) { grunt.loadNpmTasks("grunt-contrib-uglify"); // Default task(s). - grunt.registerTask("default", ["lineending", "jshint", "jscs", "jasmine_node", "browserify", "jasmine", "uglify"]); + grunt.registerTask("default", ["copy", "lineending", "jshint", "jscs", "jasmine_node", "browserify", "jasmine", "uglify"]); grunt.registerTask("test", ["jasmine_node"]); }; diff --git a/json-schema b/json-schema new file mode 160000 index 0000000..cc8ec81 --- /dev/null +++ b/json-schema @@ -0,0 +1 @@ +Subproject commit cc8ec81ce0abe2385ebd6c2a6f2d6deb646f874a diff --git a/src/ZSchema.js b/src/ZSchema.js index 659db29..f01f2f4 100644 --- a/src/ZSchema.js +++ b/src/ZSchema.js @@ -8,6 +8,8 @@ var SchemaCache = require("./SchemaCache"); var SchemaCompilation = require("./SchemaCompilation"); var SchemaValidation = require("./SchemaValidation"); var Utils = require("./Utils"); +var Draft4Schema = require("./schemas/schema.json"); +var Draft4HyperSchema = require("./schemas/hyper-schema.json"); /* default options @@ -58,6 +60,9 @@ function ZSchema(options) { this.cache = {}; this.referenceCache = []; + this.setRemoteReference("http://json-schema.org/draft-04/schema", Draft4Schema); + this.setRemoteReference("http://json-schema.org/draft-04/hyper-schema", Draft4HyperSchema); + // options if (typeof options === "object") { var keys = Object.keys(options), diff --git a/src/schemas/hyper-schema.json b/src/schemas/hyper-schema.json new file mode 100644 index 0000000..c2cb9d1 --- /dev/null +++ b/src/schemas/hyper-schema.json @@ -0,0 +1,158 @@ +{ + "$schema": "http://json-schema.org/draft-04/hyper-schema#", + "id": "http://json-schema.org/draft-04/hyper-schema#", + "title": "JSON Hyper-Schema", + "allOf": [ + { + "$ref": "http://json-schema.org/draft-04/schema#" + } + ], + "properties": { + "additionalItems": { + "anyOf": [ + { + "type": "boolean" + }, + { + "$ref": "#" + } + ] + }, + "additionalProperties": { + "anyOf": [ + { + "type": "boolean" + }, + { + "$ref": "#" + } + ] + }, + "dependencies": { + "additionalProperties": { + "anyOf": [ + { + "$ref": "#" + }, + { + "type": "array" + } + ] + } + }, + "items": { + "anyOf": [ + { + "$ref": "#" + }, + { + "$ref": "#/definitions/schemaArray" + } + ] + }, + "definitions": { + "additionalProperties": { + "$ref": "#" + } + }, + "patternProperties": { + "additionalProperties": { + "$ref": "#" + } + }, + "properties": { + "additionalProperties": { + "$ref": "#" + } + }, + "allOf": { + "$ref": "#/definitions/schemaArray" + }, + "anyOf": { + "$ref": "#/definitions/schemaArray" + }, + "oneOf": { + "$ref": "#/definitions/schemaArray" + }, + "not": { + "$ref": "#" + }, + + "links": { + "type": "array", + "items": { + "$ref": "#/definitions/linkDescription" + } + }, + "fragmentResolution": { + "type": "string" + }, + "media": { + "type": "object", + "properties": { + "type": { + "description": "A media type, as described in RFC 2046", + "type": "string" + }, + "binaryEncoding": { + "description": "A content encoding scheme, as described in RFC 2045", + "type": "string" + } + } + }, + "pathStart": { + "description": "Instances' URIs must start with this value for this schema to apply to them", + "type": "string", + "format": "uri" + } + }, + "definitions": { + "schemaArray": { + "type": "array", + "items": { + "$ref": "#" + } + }, + "linkDescription": { + "title": "Link Description Object", + "type": "object", + "required": [ "href", "rel" ], + "properties": { + "href": { + "description": "a URI template, as defined by RFC 6570, with the addition of the $, ( and ) characters for pre-processing", + "type": "string" + }, + "rel": { + "description": "relation to the target resource of the link", + "type": "string" + }, + "title": { + "description": "a title for the link", + "type": "string" + }, + "targetSchema": { + "description": "JSON Schema describing the link target", + "$ref": "#" + }, + "mediaType": { + "description": "media type (as defined by RFC 2046) describing the link target", + "type": "string" + }, + "method": { + "description": "method for requesting the target of the link (e.g. for HTTP this might be \"GET\" or \"DELETE\")", + "type": "string" + }, + "encType": { + "description": "The media type in which to submit data along with the request", + "type": "string", + "default": "application/json" + }, + "schema": { + "description": "Schema describing the data to submit along with the request", + "$ref": "#" + } + } + } + } +} + diff --git a/src/schemas/schema.json b/src/schemas/schema.json new file mode 100644 index 0000000..85eb502 --- /dev/null +++ b/src/schemas/schema.json @@ -0,0 +1,150 @@ +{ + "id": "http://json-schema.org/draft-04/schema#", + "$schema": "http://json-schema.org/draft-04/schema#", + "description": "Core schema meta-schema", + "definitions": { + "schemaArray": { + "type": "array", + "minItems": 1, + "items": { "$ref": "#" } + }, + "positiveInteger": { + "type": "integer", + "minimum": 0 + }, + "positiveIntegerDefault0": { + "allOf": [ { "$ref": "#/definitions/positiveInteger" }, { "default": 0 } ] + }, + "simpleTypes": { + "enum": [ "array", "boolean", "integer", "null", "number", "object", "string" ] + }, + "stringArray": { + "type": "array", + "items": { "type": "string" }, + "minItems": 1, + "uniqueItems": true + } + }, + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uri" + }, + "$schema": { + "type": "string", + "format": "uri" + }, + "title": { + "type": "string" + }, + "description": { + "type": "string" + }, + "default": {}, + "multipleOf": { + "type": "number", + "minimum": 0, + "exclusiveMinimum": true + }, + "maximum": { + "type": "number" + }, + "exclusiveMaximum": { + "type": "boolean", + "default": false + }, + "minimum": { + "type": "number" + }, + "exclusiveMinimum": { + "type": "boolean", + "default": false + }, + "maxLength": { "$ref": "#/definitions/positiveInteger" }, + "minLength": { "$ref": "#/definitions/positiveIntegerDefault0" }, + "pattern": { + "type": "string", + "format": "regex" + }, + "additionalItems": { + "anyOf": [ + { "type": "boolean" }, + { "$ref": "#" } + ], + "default": {} + }, + "items": { + "anyOf": [ + { "$ref": "#" }, + { "$ref": "#/definitions/schemaArray" } + ], + "default": {} + }, + "maxItems": { "$ref": "#/definitions/positiveInteger" }, + "minItems": { "$ref": "#/definitions/positiveIntegerDefault0" }, + "uniqueItems": { + "type": "boolean", + "default": false + }, + "maxProperties": { "$ref": "#/definitions/positiveInteger" }, + "minProperties": { "$ref": "#/definitions/positiveIntegerDefault0" }, + "required": { "$ref": "#/definitions/stringArray" }, + "additionalProperties": { + "anyOf": [ + { "type": "boolean" }, + { "$ref": "#" } + ], + "default": {} + }, + "definitions": { + "type": "object", + "additionalProperties": { "$ref": "#" }, + "default": {} + }, + "properties": { + "type": "object", + "additionalProperties": { "$ref": "#" }, + "default": {} + }, + "patternProperties": { + "type": "object", + "additionalProperties": { "$ref": "#" }, + "default": {} + }, + "dependencies": { + "type": "object", + "additionalProperties": { + "anyOf": [ + { "$ref": "#" }, + { "$ref": "#/definitions/stringArray" } + ] + } + }, + "enum": { + "type": "array", + "minItems": 1, + "uniqueItems": true + }, + "type": { + "anyOf": [ + { "$ref": "#/definitions/simpleTypes" }, + { + "type": "array", + "items": { "$ref": "#/definitions/simpleTypes" }, + "minItems": 1, + "uniqueItems": true + } + ] + }, + "allOf": { "$ref": "#/definitions/schemaArray" }, + "anyOf": { "$ref": "#/definitions/schemaArray" }, + "oneOf": { "$ref": "#/definitions/schemaArray" }, + "not": { "$ref": "#" } + }, + "dependencies": { + "exclusiveMaximum": [ "maximum" ], + "exclusiveMinimum": [ "minimum" ] + }, + "default": {} +} diff --git a/test/spec/ZSchemaTestSuiteSpec.js b/test/spec/ZSchemaTestSuiteSpec.js index 7e250f7..168bba6 100644 --- a/test/spec/ZSchemaTestSuiteSpec.js +++ b/test/spec/ZSchemaTestSuiteSpec.js @@ -90,8 +90,7 @@ describe("ZSchemaTestSuite", function () { !async && it(testSuite.description + ", " + test.description, function () { var validator = new ZSchema(options); - validator.setRemoteReference("http://json-schema.org/draft-04/schema", require("../files/draft-04-schema.json")); - validator.setRemoteReference("http://json-schema.org/draft-04/hyper-schema", require("../files/draft-04-hyper-schema.json")); + if (setup) { setup(validator, ZSchema); } var valid = validator.validateSchema(schema);