public function testAddEnum() { $enum = new EnumDescriptor('vendor:package:number', 'int', [1, 2, 3, 4]); SchemaStore::addEnum($enum->getId(), $enum); $this->assertEquals(SchemaStore::getEnumById('vendor:package:number'), $enum); }
/** * Construct. */ public function __construct() { $enums = []; $schemas = []; foreach (SchemaStore::getDirs() as $dir) { if (!is_dir($dir)) { continue; } $files = Finder::create()->files()->in($dir)->name('*.xml'); /** @var \Symfony\Component\Finder\SplFileInfo $file */ foreach ($files as $file) { if ($file->getFilename() == 'enums.xml') { $enums[] = $file->getPathName(); } else { $schemas[] = $file->getPathName(); } } } ksort($enums); ksort($schemas); /* * Enums */ $parser = new EnumParser(); foreach ($enums as $file) { $enums = $parser->fromFile($file); foreach ($enums as $enum) { SchemaStore::addEnum($enum->getId(), $enum); } } /* * Schemas */ $parser = new SchemaParser(); $validator = new SchemaValidator(); $currentFile = null; $exceptionFile = []; while (count($schemas) > 0) { if (!$currentFile) { $currentFile = current($schemas); } $file = $currentFile; try { if ($schema = $parser->fromFile($file)) { SchemaStore::addSchema($schema->getId(), $schema); $validator->validate($schema); } } catch (MissingSchema $e) { // remove "v" (version) from schemaId, // and replace colons with slashes (convert to path format) $pattern = sprintf('/%s%s(.*)/', str_replace([':v', ':'], [':', '\\/'], $e->getMessage()), strpos($e->getMessage(), ':v') === false ? '\\/' : null); // remove duplicate slashes $pattern = str_replace('\\/\\/', '\\/', $pattern); // get matched files $files = preg_grep($pattern, $schemas); if ($files === false || count($files) === 0) { throw new \RuntimeException(sprintf('Schema with id "%s" is invalid.', $e->getMessage())); } if (in_array($currentFile, $exceptionFile)) { throw new \RuntimeException(sprintf('Recursively requesting schema id "%s" from file "%s".', $e->getMessage(), $currentFile)); } $exceptionFile[] = $currentFile; $currentFile = strpos($e->getMessage(), ':v') ? current($files) : end($files); continue; } unset($schemas[array_search($currentFile, $schemas)]); $currentFile = null; $exceptionFile = []; } /** @var SchemaDescriptor $schema */ foreach (SchemaStore::getSchemasByCurieMajor() as $schema) { $schema->setIsLatestVersion(true); } }