Example #1
0
 /**
  * @expectedException \InvalidArgumentException
  */
 public function testFromFileException()
 {
     $parser = new EnumParser();
     $parser->fromFile(__DIR__ . '/Fixtures/missing_enum_type.xml');
 }
Example #2
0
 /**
  * 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);
     }
 }