diff --git a/composer.lock b/composer.lock index c8a915f..394af4a 100644 --- a/composer.lock +++ b/composer.lock @@ -245,16 +245,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "12.3.0", + "version": "12.3.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "9075a8efc66e11bc55c319062e147bdb06777267" + "reference": "ddec29dfc128eba9c204389960f2063f3b7fa170" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/9075a8efc66e11bc55c319062e147bdb06777267", - "reference": "9075a8efc66e11bc55c319062e147bdb06777267", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ddec29dfc128eba9c204389960f2063f3b7fa170", + "reference": "ddec29dfc128eba9c204389960f2063f3b7fa170", "shasum": "" }, "require": { @@ -310,7 +310,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "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": [ { @@ -330,7 +330,7 @@ "type": "tidelift" } ], - "time": "2025-05-23T15:49:03+00:00" + "time": "2025-06-18T08:58:13+00:00" }, { "name": "phpunit/php-file-iterator", @@ -579,16 +579,16 @@ }, { "name": "phpunit/phpunit", - "version": "12.2.1", + "version": "12.2.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "5f09fda04e7caea93cff50b4e90319184f3e6ee3" + "reference": "60a8ea2d8b2f070000051b56778009e11576e7d1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/5f09fda04e7caea93cff50b4e90319184f3e6ee3", - "reference": "5f09fda04e7caea93cff50b4e90319184f3e6ee3", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/60a8ea2d8b2f070000051b56778009e11576e7d1", + "reference": "60a8ea2d8b2f070000051b56778009e11576e7d1", "shasum": "" }, "require": { @@ -602,13 +602,13 @@ "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "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-invoker": "^6.0.0", "phpunit/php-text-template": "^5.0.0", "phpunit/php-timer": "^8.0.0", "sebastian/cli-parser": "^4.0.0", - "sebastian/comparator": "^7.0.1", + "sebastian/comparator": "^7.1.0", "sebastian/diff": "^7.0.0", "sebastian/environment": "^8.0.2", "sebastian/exporter": "^7.0.0", @@ -656,7 +656,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "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": [ { @@ -680,7 +680,7 @@ "type": "tidelift" } ], - "time": "2025-06-07T05:17:47+00:00" + "time": "2025-06-20T11:33:06+00:00" }, { "name": "sebastian/cli-parser", @@ -741,16 +741,16 @@ }, { "name": "sebastian/comparator", - "version": "7.0.1", + "version": "7.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "b478f34614f934e0291598d0c08cbaba9644bee5" + "reference": "03d905327dccc0851c9a08d6a979dfc683826b6f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/b478f34614f934e0291598d0c08cbaba9644bee5", - "reference": "b478f34614f934e0291598d0c08cbaba9644bee5", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/03d905327dccc0851c9a08d6a979dfc683826b6f", + "reference": "03d905327dccc0851c9a08d6a979dfc683826b6f", "shasum": "" }, "require": { @@ -761,7 +761,7 @@ "sebastian/exporter": "^7.0" }, "require-dev": { - "phpunit/phpunit": "^12.0" + "phpunit/phpunit": "^12.2" }, "suggest": { "ext-bcmath": "For comparing BcMath\\Number objects" @@ -769,7 +769,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "7.0-dev" + "dev-main": "7.1-dev" } }, "autoload": { @@ -809,15 +809,27 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "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": [ { "url": "https://github.com/sebastianbergmann", "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", diff --git a/sources/classes/VersionInfo.md b/sources/classes/VersionInfo.md index d5e64a6..ab66c45 100644 --- a/sources/classes/VersionInfo.md +++ b/sources/classes/VersionInfo.md @@ -2,9 +2,10 @@ ## Информация о версии -Версия класса: 1.0 +Версия класса: 1.1 Впервые введено в пакет с версии: 1.0.24 +Последнее обновление в версии: 1.0.27 Описание класса: Класс, описывающий информацию о версии. @@ -206,6 +207,106 @@ -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`. diff --git a/sources/classes/VersionInfo.php b/sources/classes/VersionInfo.php index e0e259a..dfb44f4 100644 --- a/sources/classes/VersionInfo.php +++ b/sources/classes/VersionInfo.php @@ -11,7 +11,7 @@ use goodboyalex\php_components_pack\extensions\StringExtension; * * @author Александр Бабаев * @package php_components_pack - * @version 1.0 + * @version 1.1 * @since 1.0.24 */ final class VersionInfo @@ -329,6 +329,11 @@ final class VersionInfo // Устанавливаем правую границу $rightBorder = $right ?? $maxVersion; + // Проверяем, что границы не перепутаны + if ($leftBorder->CompareWith($rightBorder) == 0) + // - если границы перепутаны, то меняем их местами + [$leftBorder, $rightBorder] = [$rightBorder, $leftBorder]; + // Проверяем текущую версию относительно границ $compareLeft = $this->CompareWith($leftBorder); $compareRight = $this->CompareWith($rightBorder); diff --git a/tests/classes/VersionInfoTest.php b/tests/classes/VersionInfoTest.php index 3805b18..d9d7d57 100644 --- a/tests/classes/VersionInfoTest.php +++ b/tests/classes/VersionInfoTest.php @@ -2,6 +2,7 @@ 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\enums\VersionInfoStage; use PHPUnit\Framework\TestCase; @@ -103,9 +104,31 @@ class VersionInfoTest extends TestCase $versionInfo4 = new VersionInfo(5, 5, 5, 5, VersionInfoStage::Stable); + $optionNotBorder = new ObjectArray(); + // Для начала простое сравнение $this->assertEquals(0, $versionInfo1->CompareWithRange($versionInfo3, $versionInfo4)); $this->assertEquals(-1, $versionInfo2->CompareWithRange($versionInfo1, $versionInfo4)); $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)); } } \ No newline at end of file