Files
duckbrain-toolbox/packages/commands/src/Toolbox/Compatibility.php
T

85 lines
2.6 KiB
PHP

<?php
namespace Toolbox;
/**
* Modelo de compatibilidad estilo WordPress: un rango mínimo requerido y uno
* máximo probado contra el core, más el requisito de PHP. Sólo produce avisos.
*/
final class Compatibility
{
public const OK = 'ok';
public const UNTESTED = 'untested';
public const INSUFFICIENT = 'insufficient';
public const UNKNOWN = 'unknown';
public const INDEPENDENT = 'independent';
/**
* @return array{status:string, message:string}
*/
public static function evaluateCore(
?string $coreVersion,
?string $requires,
?string $tested,
bool $independent = false
): array {
if ($independent) {
return ['status' => self::INDEPENDENT, 'message' => 'independiente del core'];
}
if ($coreVersion === null) {
return ['status' => self::UNKNOWN, 'message' => 'versión del core desconocida (sin tags)'];
}
if ($requires === null && $tested === null) {
return ['status' => self::UNKNOWN, 'message' => 'sin datos de compatibilidad'];
}
if ($requires !== null && !Semver::satisfies($coreVersion, $requires)) {
return [
'status' => self::INSUFFICIENT,
'message' => "requiere core {$requires} (tienes {$coreVersion})",
];
}
if ($tested !== null && Semver::compare($coreVersion, $tested) > 0) {
return [
'status' => self::UNTESTED,
'message' => "probado hasta {$tested} (tienes {$coreVersion})",
];
}
return ['status' => self::OK, 'message' => 'compatible'];
}
/**
* @return array{status:string, message:string}
*/
public static function evaluatePhp(?string $requires, string $phpVersion): array
{
if ($requires === null) {
return ['status' => self::UNKNOWN, 'message' => 'sin datos de PHP'];
}
if (!Semver::satisfies($phpVersion, $requires)) {
return [
'status' => self::INSUFFICIENT,
'message' => "requiere PHP {$requires} (tienes {$phpVersion})",
];
}
return ['status' => self::OK, 'message' => 'compatible'];
}
public static function label(string $status): string
{
return match ($status) {
self::OK => 'OK',
self::UNTESTED => 'NO PROBADO',
self::INSUFFICIENT => 'INSUFICIENTE',
self::INDEPENDENT => 'INDEPENDIENTE',
default => 'SIN DATOS',
};
}
}