Added TDF validation script

This commit is contained in:
Nav
2021-06-01 23:54:04 +01:00
parent 571211b337
commit 80749e2b5b
3 changed files with 186 additions and 0 deletions

View File

@@ -0,0 +1,102 @@
<?php
require_once __DIR__ . "/Variant.php";
class TargetDescriptionFile
{
public string $filePath;
public ?SimpleXMLElement $xml = null;
public ?string $targetName = null;
public ?string $targetArchitecture = null;
/** @var Variant[] */
public array $variants = [];
public function __construct(string $filePath)
{
$this->filePath = $filePath;
$this->init();
}
private function init()
{
if (!file_exists($this->filePath)) {
throw new Exception("Invalid TDF file path - file does not exist.");
}
$xml = simplexml_load_file($this->filePath);
if ($xml === false) {
throw new Exception("Failed to parse TDF XML.");
}
$this->xml = $xml;
/** @var SimpleXMLElement[] $devices */
$devices = (array) $xml->devices;
if (!empty($devices)) {
$device = reset($devices);
$deviceAttributes = $device->attributes();
if (!empty($deviceAttributes['name'])) {
$this->targetName = $device['name'];
}
if (!empty($deviceAttributes['architecture'])) {
$this->targetArchitecture = $device['architecture'];
}
}
$variantElements = $xml->xpath('variants/variant');
foreach ($variantElements as $variantElement) {
$variantAttributes = $variantElement->attributes();
$variant = new Variant();
if (!empty($variantAttributes['ordercode'])) {
$variant->name = $variantAttributes['ordercode'];
}
if (!empty($variantAttributes['name'])) {
$variant->name = $variantAttributes['name'];
}
if (!empty($variantAttributes['package'])) {
$variant->package = $variantAttributes['package'];
}
if (!empty($variantAttributes['pinout'])) {
$variant->pinout = $variantAttributes['pinout'];
}
$this->variants[] = $variant;
}
}
public function validate(): array
{
$failures = [];
if (empty($this->targetName)) {
$failures[] = 'Target name not found';
}
if (empty($this->targetArchitecture)) {
$failures[] = 'Target architecture not found';
}
if (empty($this->variants)) {
$failures[] = 'Missing target variants';
}
foreach ($this->variants as $variant) {
$variantValidationFailures = $variant->validate();
if (!empty($variantValidationFailures)) {
$failures[] = 'Variant validation failures: ' . implode(", ", $variantValidationFailures);
}
}
return $failures;
}
}

View File

@@ -0,0 +1,57 @@
<?php
require_once __DIR__ . "/TargetDescriptionFile.php";
const TDF_DIR_PATH = __DIR__ . "/../../resources/TargetDescriptionFiles";
/**
* @param string $dirPath
* @return SplFileInfo[]
*/
function getXmlFiles(string $dirPath): array
{
$output = [];
$directory = new DirectoryIterator($dirPath);
foreach ($directory as $entry) {
if ($entry->isFile() && $entry->getExtension() == 'xml') {
$output[] = clone $entry;
} else if ($entry->isDir() && !$entry->isDot()) {
$output = array_merge($output, getXmlFiles($entry->getPathname()));
}
}
return $output;
}
$xmlFiles = getXmlFiles(TDF_DIR_PATH);
$failedValidationCount = 0;
foreach ($xmlFiles as $xmlFile) {
$targetDescriptionFile = new TargetDescriptionFile($xmlFile->getPathname());
$validationFailures = $targetDescriptionFile->validate();
if (!empty($validationFailures)) {
$failedValidationCount++;
print "\033[31m";
print "Validation for " . $xmlFile->getFilename() . " failed.\n";
print "Full path: " . $xmlFile->getRealPath() . "\n";
print count($validationFailures) . " errors found:\n";
print implode("\n", $validationFailures);
print "\n\n";
print "\033[0m";
} else {
print "\033[32m";
print "Validation for " . $xmlFile->getFilename() . " passed.\n";
print "\033[0m";
}
}
print "\n\n";
print "Validated " . count($xmlFiles) . " TDFs. ";
print (($failedValidationCount > 0) ? "\033[31m" : "\033[32m");
print $failedValidationCount . " failures." . "\033[0m" . "\n";
echo "Done\n";

View File

@@ -0,0 +1,27 @@
<?php
class Variant
{
public ?string $name = null;
public ?string $package = null;
public ?string $pinout = null;
public function validate(): array
{
$failures = [];
if (empty($this->name)) {
$failures[] = 'Name not found';
}
if ($this->name == "standard") {
$failures[] = 'Name set to "standard" - needs attention';
}
if (empty($this->package)) {
$failures[] = 'Package not found';
}
return $failures;
}
}