* Добавлено перечисление VersionCompareRangeOption.
* В классе VersionInfo добавлен метод CompareWithRange.
This commit is contained in:
Александр Бабаев 2025-06-25 23:24:50 +03:00
parent df660676d0
commit 1290a567de
4 changed files with 165 additions and 24 deletions

56
composer.lock generated
View File

@ -245,16 +245,16 @@
}, },
{ {
"name": "phpunit/php-code-coverage", "name": "phpunit/php-code-coverage",
"version": "12.3.0", "version": "12.3.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
"reference": "9075a8efc66e11bc55c319062e147bdb06777267" "reference": "ddec29dfc128eba9c204389960f2063f3b7fa170"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/9075a8efc66e11bc55c319062e147bdb06777267", "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ddec29dfc128eba9c204389960f2063f3b7fa170",
"reference": "9075a8efc66e11bc55c319062e147bdb06777267", "reference": "ddec29dfc128eba9c204389960f2063f3b7fa170",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -310,7 +310,7 @@
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
"security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
"source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.3.0" "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.3.1"
}, },
"funding": [ "funding": [
{ {
@ -330,7 +330,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2025-05-23T15:49:03+00:00" "time": "2025-06-18T08:58:13+00:00"
}, },
{ {
"name": "phpunit/php-file-iterator", "name": "phpunit/php-file-iterator",
@ -579,16 +579,16 @@
}, },
{ {
"name": "phpunit/phpunit", "name": "phpunit/phpunit",
"version": "12.2.1", "version": "12.2.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git", "url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "5f09fda04e7caea93cff50b4e90319184f3e6ee3" "reference": "60a8ea2d8b2f070000051b56778009e11576e7d1"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/5f09fda04e7caea93cff50b4e90319184f3e6ee3", "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/60a8ea2d8b2f070000051b56778009e11576e7d1",
"reference": "5f09fda04e7caea93cff50b4e90319184f3e6ee3", "reference": "60a8ea2d8b2f070000051b56778009e11576e7d1",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -602,13 +602,13 @@
"phar-io/manifest": "^2.0.4", "phar-io/manifest": "^2.0.4",
"phar-io/version": "^3.2.1", "phar-io/version": "^3.2.1",
"php": ">=8.3", "php": ">=8.3",
"phpunit/php-code-coverage": "^12.3.0", "phpunit/php-code-coverage": "^12.3.1",
"phpunit/php-file-iterator": "^6.0.0", "phpunit/php-file-iterator": "^6.0.0",
"phpunit/php-invoker": "^6.0.0", "phpunit/php-invoker": "^6.0.0",
"phpunit/php-text-template": "^5.0.0", "phpunit/php-text-template": "^5.0.0",
"phpunit/php-timer": "^8.0.0", "phpunit/php-timer": "^8.0.0",
"sebastian/cli-parser": "^4.0.0", "sebastian/cli-parser": "^4.0.0",
"sebastian/comparator": "^7.0.1", "sebastian/comparator": "^7.1.0",
"sebastian/diff": "^7.0.0", "sebastian/diff": "^7.0.0",
"sebastian/environment": "^8.0.2", "sebastian/environment": "^8.0.2",
"sebastian/exporter": "^7.0.0", "sebastian/exporter": "^7.0.0",
@ -656,7 +656,7 @@
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues", "issues": "https://github.com/sebastianbergmann/phpunit/issues",
"security": "https://github.com/sebastianbergmann/phpunit/security/policy", "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
"source": "https://github.com/sebastianbergmann/phpunit/tree/12.2.1" "source": "https://github.com/sebastianbergmann/phpunit/tree/12.2.3"
}, },
"funding": [ "funding": [
{ {
@ -680,7 +680,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2025-06-07T05:17:47+00:00" "time": "2025-06-20T11:33:06+00:00"
}, },
{ {
"name": "sebastian/cli-parser", "name": "sebastian/cli-parser",
@ -741,16 +741,16 @@
}, },
{ {
"name": "sebastian/comparator", "name": "sebastian/comparator",
"version": "7.0.1", "version": "7.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/comparator.git", "url": "https://github.com/sebastianbergmann/comparator.git",
"reference": "b478f34614f934e0291598d0c08cbaba9644bee5" "reference": "03d905327dccc0851c9a08d6a979dfc683826b6f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/b478f34614f934e0291598d0c08cbaba9644bee5", "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/03d905327dccc0851c9a08d6a979dfc683826b6f",
"reference": "b478f34614f934e0291598d0c08cbaba9644bee5", "reference": "03d905327dccc0851c9a08d6a979dfc683826b6f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -761,7 +761,7 @@
"sebastian/exporter": "^7.0" "sebastian/exporter": "^7.0"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^12.0" "phpunit/phpunit": "^12.2"
}, },
"suggest": { "suggest": {
"ext-bcmath": "For comparing BcMath\\Number objects" "ext-bcmath": "For comparing BcMath\\Number objects"
@ -769,7 +769,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "7.0-dev" "dev-main": "7.1-dev"
} }
}, },
"autoload": { "autoload": {
@ -809,15 +809,27 @@
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/comparator/issues", "issues": "https://github.com/sebastianbergmann/comparator/issues",
"security": "https://github.com/sebastianbergmann/comparator/security/policy", "security": "https://github.com/sebastianbergmann/comparator/security/policy",
"source": "https://github.com/sebastianbergmann/comparator/tree/7.0.1" "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.0"
}, },
"funding": [ "funding": [
{ {
"url": "https://github.com/sebastianbergmann", "url": "https://github.com/sebastianbergmann",
"type": "github" "type": "github"
},
{
"url": "https://liberapay.com/sebastianbergmann",
"type": "liberapay"
},
{
"url": "https://thanks.dev/u/gh/sebastianbergmann",
"type": "thanks_dev"
},
{
"url": "https://tidelift.com/funding/github/packagist/sebastian/comparator",
"type": "tidelift"
} }
], ],
"time": "2025-03-07T07:00:32+00:00" "time": "2025-06-17T07:41:58+00:00"
}, },
{ {
"name": "sebastian/complexity", "name": "sebastian/complexity",

View File

@ -2,9 +2,10 @@
## Информация о версии ## Информация о версии
Версия класса: 1.0 Версия класса: 1.1
Впервые введено в пакет с версии: 1.0.24 Впервые введено в пакет с версии: 1.0.24
Последнее обновление в версии: 1.0.27
Описание класса: Класс, описывающий информацию о версии. Описание класса: Класс, описывающий информацию о версии.
@ -206,6 +207,106 @@
-1|0|1 -1|0|1
#### Метод `CompareWithRange`
Введено в версии `1.0.27`.
Это метод, который проверяет, находится ли текущая версия в заданном диапазоне, указанном в **2 необязательных
параметрах**:
* `VersionInfo (или null) $left` - левая граница, по умолчанию, `null`;
* `VersionInfo (или null) $right` - правая граница, по умолчанию, `null`.
В случае, если будет передан `null` вместо левой границы, то метод создаст класс `VersionInfo` с минимально возможной
версией `0.0.0.0 PreAlpha 0`, а вместо правой - `VersionInfo` с максимально возможной версией
`9223372036854775807.9223372036854775807.9223372036854775807.9223372036854775807 Stable` (здесь `9223372036854775807` -
максимальное число INT по умолчанию - у вас может быть другое).
Границы могут совпадать, тогда поведение будет совпадать с методом `CompareWith` (при условии, что границы включены).
Кроме того, работает защита "от дурака" и если границы перепутаны, то метод автоматически поменяет их местами.
**3-й необязательный параметр** отвечает за параметры сравнения. Это `ObjectArray` из перечисления
`VersionCompareRangeOption`, который может содержать следующие настройки:
| Настройка | Описание | Включена по умолчанию |
|:-------------------:|:-------------------------------------:|:---------------------:|
| LeftBorderIncluded | Включена ли левая граница в диапазон | ДА |
| RightBorderIncluded | Включена ли правая граница в диапазон | ДА |
Этот метод возвращает `int`:
| Текущая версия | Результат |
|:---------------------------------:|:---------:|
| Младше диапазона | -1 |
| Внутри диапазона (или на границе) | 0 |
| Старше диапазона | 1 |
Синтаксис:
public function CompareWithRange (?VersionInfo $left = null, ?VersionInfo $right = null, ?ObjectArray $options = null): int
Пример,
// Создаю объекты
// - 1.2.3.4 Beta 1
$versionInfo1 = new VersionInfo(1, 2, 3, 4, VersionInfoStage::Beta, 1);
// - 1.1.3.4 Alpha 2
$versionInfo2 = new VersionInfo(1, 1, 3, 4, VersionInfoStage::Alpha, 2);
// - 1.1.1.1 Alpha 2
$versionInfo3 = new VersionInfo(1, 1, 1, 1, VersionInfoStage::Alpha, 2);
// - 5.5.5.5 Stable
$versionInfo4 = new VersionInfo(5, 5, 5, 5, VersionInfoStage::Stable);
// Сравниваю
echo "Для начала простое сравнение: ";
$ver1d1 = $versionInfo1->CompareWithRange($versionInfo3, $versionInfo4);
$ver1d2 = $versionInfo2->CompareWithRange($versionInfo1, $versionInfo4);
$ver1d2 = $versionInfo4->CompareWithRange($versionInfo2, $versionInfo1);
echo "$ver1d1|$ver1d2|$ver1d3 \r\n"
echo "Немного перепутаем границы =) ";
$ver2d1 = $versionInfo4->CompareWithRange($versionInfo1, $versionInfo2);
echo "И получим: $ver2d1\r\n";
echo "А теперь с границами!\r\n";
echo "- значение равно левой границе: ";
$ver3d1 = $versionInfo2->CompareWithRange($versionInfo2, $versionInfo1);
echo " $ver3d1\r\n";
echo "- значение равно правой границе: ";
$ver3d2 = $versionInfo1->CompareWithRange($versionInfo2, $versionInfo1);
echo " $ver3d2\r\n";
echo "- а теперь с выключением границ:\r\n";
echo "-- для левой: ";
$ver3d3 = $versionInfo2->CompareWithRange($versionInfo2, $versionInfo1, $optionNotBorder);
echo " $ver3d3\r\n";
echo "-- для правой: ";
$ver3d4 = $versionInfo1->CompareWithRange($versionInfo2, $versionInfo1, $optionNotBorder);
echo " $ver3d4\r\n";
echo "А что если границы равны и значение равно?\r\n";
echo "- для включённых границ: ";
$ver4d1 = $versionInfo1->CompareWithRange($versionInfo1, $versionInfo1);
echo " $ver4d1\r\n";
echo "- для выключённых границ: ";
$ver4d2 = $versionInfo1->CompareWithRange($versionInfo1, $versionInfo1, $optionNotBorder);
echo " $ver4d2";
В результате на экране появится:
Для начала простое сравнение: 0|-1|1
Немного перепутаем границы =) И получим: 1
А теперь с границами!
- значение равно левой границе: 0
- значение равно правой границе: 0
- а теперь с выключением границ:
-- для левой: -1
-- для правой: 1
А что если границы равны и значение равно?
- для включённых границ: 0
- для выключённых границ: -1
### Парсинг версий ### Парсинг версий
Для преобразования строки с версией в объект `VersionInfo` используется статичный метод `Parse`. Для преобразования строки с версией в объект `VersionInfo` используется статичный метод `Parse`.

View File

@ -11,7 +11,7 @@ use goodboyalex\php_components_pack\extensions\StringExtension;
* *
* @author Александр Бабаев * @author Александр Бабаев
* @package php_components_pack * @package php_components_pack
* @version 1.0 * @version 1.1
* @since 1.0.24 * @since 1.0.24
*/ */
final class VersionInfo final class VersionInfo
@ -329,6 +329,11 @@ final class VersionInfo
// Устанавливаем правую границу // Устанавливаем правую границу
$rightBorder = $right ?? $maxVersion; $rightBorder = $right ?? $maxVersion;
// Проверяем, что границы не перепутаны
if ($leftBorder->CompareWith($rightBorder) == 0)
// - если границы перепутаны, то меняем их местами
[$leftBorder, $rightBorder] = [$rightBorder, $leftBorder];
// Проверяем текущую версию относительно границ // Проверяем текущую версию относительно границ
$compareLeft = $this->CompareWith($leftBorder); $compareLeft = $this->CompareWith($leftBorder);
$compareRight = $this->CompareWith($rightBorder); $compareRight = $this->CompareWith($rightBorder);

View File

@ -2,6 +2,7 @@
namespace goodboyalex\php_components_pack\tests\classes; namespace goodboyalex\php_components_pack\tests\classes;
use goodboyalex\php_components_pack\classes\ObjectArray;
use goodboyalex\php_components_pack\classes\VersionInfo; use goodboyalex\php_components_pack\classes\VersionInfo;
use goodboyalex\php_components_pack\enums\VersionInfoStage; use goodboyalex\php_components_pack\enums\VersionInfoStage;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
@ -103,9 +104,31 @@ class VersionInfoTest extends TestCase
$versionInfo4 = new VersionInfo(5, 5, 5, 5, VersionInfoStage::Stable); $versionInfo4 = new VersionInfo(5, 5, 5, 5, VersionInfoStage::Stable);
$optionNotBorder = new ObjectArray();
// Для начала простое сравнение // Для начала простое сравнение
$this->assertEquals(0, $versionInfo1->CompareWithRange($versionInfo3, $versionInfo4)); $this->assertEquals(0, $versionInfo1->CompareWithRange($versionInfo3, $versionInfo4));
$this->assertEquals(-1, $versionInfo2->CompareWithRange($versionInfo1, $versionInfo4)); $this->assertEquals(-1, $versionInfo2->CompareWithRange($versionInfo1, $versionInfo4));
$this->assertEquals(1, $versionInfo4->CompareWithRange($versionInfo2, $versionInfo1)); $this->assertEquals(1, $versionInfo4->CompareWithRange($versionInfo2, $versionInfo1));
// Немного перепутаем границы =)
$this->assertEquals(1, $versionInfo4->CompareWithRange($versionInfo1, $versionInfo2));
// А теперь с границами
// - значение равно левой границе
$this->assertEquals(0, $versionInfo2->CompareWithRange($versionInfo2, $versionInfo1));
// - значение равно правой границе
$this->assertEquals(0, $versionInfo1->CompareWithRange($versionInfo2, $versionInfo1));
// - а теперь с выключением границ
// -- для левой
$this->assertEquals(-1, $versionInfo2->CompareWithRange($versionInfo2, $versionInfo1, $optionNotBorder));
// -- для правой
$this->assertEquals(1, $versionInfo1->CompareWithRange($versionInfo2, $versionInfo1, $optionNotBorder));
// А что если границы равны и значение равно
// - для включённых границ
$this->assertEquals(0, $versionInfo1->CompareWithRange($versionInfo1, $versionInfo1));
// - для выключённых границ
$this->assertEquals(-1, $versionInfo1->CompareWithRange($versionInfo1, $versionInfo1, $optionNotBorder));
} }
} }