Skip to content

Commit

Permalink
Add URI translation, package:// URI scheme & bundle spec schemas (jso…
Browse files Browse the repository at this point in the history
…nrainbow#362)

* Add URI translation for retrieval & add local copies of spec schema

* Use dist copies of schemas

No need to keep duplicate files around in package://tests/fixtures/ if
we're distributing them for users anyway.

* Move package:// translation after all other rules

Allows users to rewrite to package:// targets and still have the URI
work.
  • Loading branch information
erayd committed Mar 22, 2017
1 parent e10ce33 commit 6600918
Show file tree
Hide file tree
Showing 8 changed files with 424 additions and 417 deletions.
174 changes: 174 additions & 0 deletions dist/schema/json-schema-draft-03.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,174 @@
{
"$schema": "http://json-schema.org/draft-03/schema#",
"id": "http://json-schema.org/draft-03/schema#",
"type": "object",

"properties": {
"type": {
"type": [ "string", "array" ],
"items": {
"type": [ "string", { "$ref": "#" } ]
},
"uniqueItems": true,
"default": "any"
},

"properties": {
"type": "object",
"additionalProperties": { "$ref": "#" },
"default": {}
},

"patternProperties": {
"type": "object",
"additionalProperties": { "$ref": "#" },
"default": {}
},

"additionalProperties": {
"type": [ { "$ref": "#" }, "boolean" ],
"default": {}
},

"items": {
"type": [ { "$ref": "#" }, "array" ],
"items": { "$ref": "#" },
"default": {}
},

"additionalItems": {
"type": [ { "$ref": "#" }, "boolean" ],
"default": {}
},

"required": {
"type": "boolean",
"default": false
},

"dependencies": {
"type": "object",
"additionalProperties": {
"type": [ "string", "array", { "$ref": "#" } ],
"items": {
"type": "string"
}
},
"default": {}
},

"minimum": {
"type": "number"
},

"maximum": {
"type": "number"
},

"exclusiveMinimum": {
"type": "boolean",
"default": false
},

"exclusiveMaximum": {
"type": "boolean",
"default": false
},

"minItems": {
"type": "integer",
"minimum": 0,
"default": 0
},

"maxItems": {
"type": "integer",
"minimum": 0
},

"uniqueItems": {
"type": "boolean",
"default": false
},

"pattern": {
"type": "string",
"format": "regex"
},

"minLength": {
"type": "integer",
"minimum": 0,
"default": 0
},

"maxLength": {
"type": "integer"
},

"enum": {
"type": "array",
"minItems": 1,
"uniqueItems": true
},

"default": {
"type": "any"
},

"title": {
"type": "string"
},

"description": {
"type": "string"
},

"format": {
"type": "string"
},

"divisibleBy": {
"type": "number",
"minimum": 0,
"exclusiveMinimum": true,
"default": 1
},

"disallow": {
"type": [ "string", "array" ],
"items": {
"type": [ "string", { "$ref": "#" } ]
},
"uniqueItems": true
},

"extends": {
"type": [ { "$ref": "#" }, "array" ],
"items": { "$ref": "#" },
"default": {}
},

"id": {
"type": "string",
"format": "uri"
},

"$ref": {
"type": "string",
"format": "uri"
},

"$schema": {
"type": "string",
"format": "uri"
}
},

"dependencies": {
"exclusiveMinimum": "minimum",
"exclusiveMaximum": "maximum"
},

"default": {}
}
150 changes: 150 additions & 0 deletions dist/schema/json-schema-draft-04.json
Original file line number Diff line number Diff line change
@@ -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": {}
}
38 changes: 37 additions & 1 deletion src/JsonSchema/Uri/UriRetriever.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,14 @@
*/
class UriRetriever implements BaseUriRetrieverInterface
{
/**
* @var array Map of URL translations
*/
protected $translationMap = array(
// use local copies of the spec schemas
'|^https?://json-schema.org/draft-(0[34])/schema#?|' => 'package://dist/schema/json-schema-draft-$1.json'
);

/**
* @var null|UriRetrieverInterface
*/
Expand Down Expand Up @@ -134,7 +142,7 @@ public function resolvePointer($jsonSchema, $uri)
/**
* {@inheritdoc}
*/
public function retrieve($uri, $baseUri = null)
public function retrieve($uri, $baseUri = null, $translate = true)
{
$resolver = new UriResolver();
$resolvedUri = $fetchUri = $resolver->resolve($uri, $baseUri);
Expand All @@ -146,6 +154,11 @@ public function retrieve($uri, $baseUri = null)
$fetchUri = $resolver->generate($arParts);
}

// apply URI translations
if ($translate) {
$fetchUri = $this->translate($fetchUri);
}

$jsonSchema = $this->loadSchema($fetchUri);

// Use the JSON pointer if specified
Expand Down Expand Up @@ -291,4 +304,27 @@ public function isValid($uri)

return !empty($components);
}

/**
* Set a URL translation rule
*/
public function setTranslation($from, $to)
{
$this->translationMap[$from] = $to;
}

/**
* Apply URI translation rules
*/
public function translate($uri)
{
foreach ($this->translationMap as $from => $to) {
$uri = preg_replace($from, $to, $uri);
}

// translate references to local files within the json-schema package
$uri = preg_replace('|^package://|', sprintf('file://%s/', realpath(__DIR__ . '/../../..')), $uri);

return $uri;
}
}
Loading

0 comments on commit 6600918

Please sign in to comment.