85 lines
2.6 KiB
PHP
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',
|
|
};
|
|
}
|
|
}
|