* В класс VersionInfo добавлен метод CompareWithRange (требует улучшения)
This commit is contained in:
Александр Бабаев 2025-06-24 22:30:57 +03:00
parent 3e199fc460
commit df660676d0
3 changed files with 119 additions and 0 deletions

View File

@ -2,6 +2,7 @@
namespace goodboyalex\php_components_pack\classes; namespace goodboyalex\php_components_pack\classes;
use goodboyalex\php_components_pack\enums\VersionCompareRangeOption;
use goodboyalex\php_components_pack\enums\VersionInfoStage; use goodboyalex\php_components_pack\enums\VersionInfoStage;
use goodboyalex\php_components_pack\extensions\StringExtension; use goodboyalex\php_components_pack\extensions\StringExtension;
@ -292,4 +293,75 @@ final class VersionInfo
// Получаем строковое представление версии и возвращаем его // Получаем строковое представление версии и возвращаем его
return $this->ToString(); return $this->ToString();
} }
/**
* Проверяет, находится ли текущая версия в заданном диапазоне.
*
* @param VersionInfo|null $left Левая граница диапазона или null, если граница не задана (будет использована
* минимальная версия).
* @param VersionInfo|null $right Правая граница диапазона или null, если граница не задана (будет использована
* максимальная версия).
* @param ObjectArray|null $options Опции проверки (по умолчанию массив, который разрешает включать границы).
*
* @return int Возвращает 1, если текущая версия старше интервала, 0, если находится в интервале, -1, если текущая
* версия младше интервала.
*
* @since 1.0.27
*/
public function CompareWithRange (?VersionInfo $left = null, ?VersionInfo $right = null,
?ObjectArray $options = null): int
{
// Подготавливаем опции, если они не переданы
$options ??= new ObjectArray([
VersionCompareRangeOption::LeftBorderIncluded,
VersionCompareRangeOption::RightBorderIncluded
]);
// Минимальная версия (случай, когда левая граница не указана)
$minVersion = new VersionInfo(0, 0, 0, 0, VersionInfoStage::PreAlpha, 0);
// Максимальная версия (случай, когда правая граница не указана)
$maxVersion = new VersionInfo(PHP_INT_MAX, PHP_INT_MAX, PHP_INT_MAX, PHP_INT_MAX, VersionInfoStage::Stable);
// Устанавливаем левую границу
$leftBorder = $left ?? $minVersion;
// Устанавливаем правую границу
$rightBorder = $right ?? $maxVersion;
// Проверяем текущую версию относительно границ
$compareLeft = $this->CompareWith($leftBorder);
$compareRight = $this->CompareWith($rightBorder);
// Проверяем, что границы включены
// - левая
$leftBorderIncluded = $options->IsExist(fn (VersionCompareRangeOption $option)
=> $option === VersionCompareRangeOption::LeftBorderIncluded);
// - правая
$rightBorderIncluded = $options->IsExist(fn (VersionCompareRangeOption $option)
=> $option === VersionCompareRangeOption::RightBorderIncluded);
// Проверяем включение границ
$isInInterval =
(
($compareLeft >= 0 && $leftBorderIncluded)
|| ($compareLeft > 0)
)
&& (
($compareRight <= 0 && $rightBorderIncluded)
|| ($compareRight < 0)
);
// Итоговая обработка результатов
if ($isInInterval)
// - версия в пределах диапазона
return 0;
else // - версия не в пределах диапазона, и если она младше левой границы (или равна ей при не включении границы)
if ($compareLeft <= 0)
// -- то возвращаем -1
return -1;
else
// -- в противном случае, версия старше правой границы (или равна ей при не включении границы)
return 1;
}
} }

View File

@ -0,0 +1,29 @@
<?php
namespace goodboyalex\php_components_pack\enums;
use goodboyalex\php_components_pack\traits\EnumExtensionsTrait;
/**
* Перечисление параметров для сравнения версий на промежутке.
*
* @author Александр Бабаев
* @package php_components_pack
* @version 1.0
* @since 1.0.27
*/
enum VersionCompareRangeOption: int
{
// Подключаю расширение для Enum
use EnumExtensionsTrait;
/**
* Левая граница включается в диапазон.
*/
case LeftBorderIncluded = 0;
/**
* Правая граница включается в диапазон.
*/
case RightBorderIncluded = 1;
}

View File

@ -90,4 +90,22 @@ class VersionInfoTest extends TestCase
$this->assertEquals(1, VersionInfo::Compare($versionInfo1, $versionInfo2)); $this->assertEquals(1, VersionInfo::Compare($versionInfo1, $versionInfo2));
} }
public function testCompareWithRange ()
{
$this->PrepareForTest();
$versionInfo1 = new VersionInfo(1, 2, 3, 4, VersionInfoStage::Beta, 1);
$versionInfo2 = new VersionInfo(1, 1, 3, 4, VersionInfoStage::Alpha, 2);
$versionInfo3 = new VersionInfo(1, 1, 1, 1, VersionInfoStage::Alpha, 2);
$versionInfo4 = new VersionInfo(5, 5, 5, 5, VersionInfoStage::Stable);
// Для начала простое сравнение
$this->assertEquals(0, $versionInfo1->CompareWithRange($versionInfo3, $versionInfo4));
$this->assertEquals(-1, $versionInfo2->CompareWithRange($versionInfo1, $versionInfo4));
$this->assertEquals(1, $versionInfo4->CompareWithRange($versionInfo2, $versionInfo1));
}
} }