first commit.

This commit is contained in:
kj
2026-10-05 15:08:39 -03:00
commit b7799f9fff
93 changed files with 8966 additions and 0 deletions
@@ -0,0 +1,77 @@
<?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';
/**
* @return array{status:string, message:string}
*/
public static function evaluateCore(
?string $coreVersion,
?string $requires,
?string $tested
): array {
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',
default => 'SIN DATOS',
};
}
}