Added TDF validation script
This commit is contained in:
102
build/scripts/TargetDescriptionFiles/TargetDescriptionFile.php
Normal file
102
build/scripts/TargetDescriptionFiles/TargetDescriptionFile.php
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
57
build/scripts/TargetDescriptionFiles/Validate.php
Normal file
57
build/scripts/TargetDescriptionFiles/Validate.php
Normal 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";
|
||||||
27
build/scripts/TargetDescriptionFiles/Variant.php
Normal file
27
build/scripts/TargetDescriptionFiles/Variant.php
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user