1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
<?php
/*
* This file is part of the ICanBoogie package.
*
* (c) Olivier Laviale <olivier.laviale@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace ICanBoogie\Autoconfig;
use Composer\Json\JsonFile;
use JsonSchema\Validator;
/**
* A JSON schema.
*
* Used to validate other JSON files.
*
* @codeCoverageIgnore
*/
class Schema
{
static public function read_json($pathname)
{
$json = file_get_contents($pathname);
JsonFile::parseJson($json, $pathname);
return json_decode($json);
}
/**
* Schema.
*
* @var mixed
*/
protected $schema;
/**
* Validator.
*
* @var Validator
*/
protected $validator;
/**
* Initialize the {@link schema} and {@link validator} properties.
*
* @param string $pathname The pathname to the schema file.
*/
public function __construct($pathname)
{
$this->schema = self::read_json($pathname);
$this->validator = new Validator;
}
/**
* Validate some data against the schema.
*
* @param mixed $data Data to validate.
* @param string $pathname The pathname to the file where the data is defined.
*
* @throws \Exception when the data is not valid.
*
* @return boolean `true` if the data is valid.
*/
public function validate($data, $pathname)
{
$validator = $this->validator;
$validator->check($data, $this->schema);
if (!$validator->isValid())
{
$errors = '';
foreach ((array) $validator->getErrors() as $error)
{
$errors .= "\n- " . ($error['property'] ? $error['property'] . ': ' : '') . $error['message'];
}
throw new \Exception("$pathname does not match the expected JSON schema:\n$errors");
}
return true;
}
/**
* Validate a JSON file against the schema.
*
* @param string $pathname The pathname to the JSON file to validate.
*
* @see validate()
*
* @return bool
*/
public function validate_file($pathname)
{
$data = self::read_json($pathname);
return $this->validate($data, $pathname);
}
}