Compare commits

..

No commits in common. "main" and "v1.0.27" have entirely different histories.

7 changed files with 54 additions and 500 deletions

12
composer.lock generated
View File

@ -579,16 +579,16 @@
}, },
{ {
"name": "phpunit/phpunit", "name": "phpunit/phpunit",
"version": "12.2.5", "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": "b71849b29f7a8d7574e4401873cb8b539896613f" "reference": "60a8ea2d8b2f070000051b56778009e11576e7d1"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b71849b29f7a8d7574e4401873cb8b539896613f", "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/60a8ea2d8b2f070000051b56778009e11576e7d1",
"reference": "b71849b29f7a8d7574e4401873cb8b539896613f", "reference": "60a8ea2d8b2f070000051b56778009e11576e7d1",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -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.5" "source": "https://github.com/sebastianbergmann/phpunit/tree/12.2.3"
}, },
"funding": [ "funding": [
{ {
@ -680,7 +680,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2025-06-27T04:37:55+00:00" "time": "2025-06-20T11:33:06+00:00"
}, },
{ {
"name": "sebastian/cli-parser", "name": "sebastian/cli-parser",

View File

@ -1,163 +0,0 @@
<?php
namespace goodboyalex\php_components_pack\classes;
use goodboyalex\php_components_pack\exceptions\JsonException;
use goodboyalex\php_components_pack\traits\JsonReWriter\JsonReWriterReadTrait;
/**
* Класс для работы с JSON-файлами.
*
* @author Александр Бабаев
* @package php_components_pack
* @version 1.0
* @since 1.1.0
*/
final class JsonReWriter
{
/**
* @var array $JsonData Массив данных.
*/
public array $JsonData;
/**
* Конструктор класса.
*/
public function __construct ()
{
$this->JsonData = [];
}
/**
* Деструктор класса.
*/
public function __destruct ()
{
unset($this->JsonData);
}
/**
* Сохраняем JSON в файл.
*
* @param string $fileName Имя файла.
*
* @return void
* @throws JsonException Если файл не может быть сохранен.
*/
public function SaveToFile (string $fileName): void
{
// Запись данных в файл
file_put_contents($fileName, json_encode($this->JsonData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
// Проверка на ошибки
if (json_last_error() !== JSON_ERROR_NONE)
// - если есть ошибки, выбрасываем исключение
throw new JsonException($fileName, json_last_error(), json_last_error_msg());
}
/**
* Загрузка данных из JSON-файла.
*
* @param string $fileName Имя файла.
*
* @return void
* @throws JsonException Если файл не существует или содержит ошибки.
*/
public function LoadFromFile (string $fileName): void
{
// Проверка существования файла
if (!is_file($fileName))
// - нет? Выбрасываем исключение
throw new JsonException($fileName, -1, "File does not exist / Файл не существует");
// Чтение содержимого файла и преобразование JSON в объект
$this->JsonData = json_decode(file_get_contents($fileName), true);
// Проверка на ошибки
if ($this->JsonData === null && json_last_error() !== JSON_ERROR_NONE)
// - если есть ошибки, выбрасываем исключение
throw new JsonException($fileName, json_last_error(), json_last_error_msg());
}
/**
* Проверяем наличие ключа в JSON.
*
* @param string $key Ключ.
*
* @return bool true если ключ найден, false если нет.
*/
public function IsKeyExists (string $key): bool
{
// Получаем массив ключей по вложенности
$keys = $this->ParseKey($key);
// Получаем текущий массив данных
$current = $this->JsonData;
// Для каждого ключа
foreach ($keys as $key) {
// - проверяем наличие ключа в текущем массиве
if (!array_key_exists($key, $current))
// - нет? Возвращаем false
return false;
// Переходим ко вложенному массиву
$current = $current[$key];
}
// Возвращаем true, если все ключи найдены
return true;
}
/**
* Получение ключей по вложенности. Т.е., ключи вида <code>"key1/key2/key3" => ["key1", "key2", "key3"]</code>.
*
* @param string $key Ключ.
*
* @return array Ключи по вложенности.
*/
private function ParseKey (string $key): array
{
return explode('/', $key);
}
/**
* Создание ключа в JSON.
*
* @param string $key Ключ.
* @param mixed $value Значение.
*
* @return void
* @throws JsonException Если ключ не является массивом.
*/
private function CreateKey (string $key, mixed $value): void
{
// Получаем массив ключей по вложенности
$keys = $this->ParseKey($key);
// Получаем текущий массив данных
$current = &$this->JsonData;
// Для каждого ключа до предпоследнего
for ($i = 0; $i < count($keys) - 1; $i++) {
// - проверяем наличие ключа в текущем массиве
if (!isset($current[$keys[$i]]))
// - нет? Создаем ключ (массив)
$current[$keys[$i]] = [];
// - проверяем, что ключ является массивом
if (!is_array($current[$keys[$i]]))
// - нет? Выбрасываем исключение
throw new JsonException(null, -1, "Key is not an array / Ключ не является массивом!");
// - переходим ко вложенному массиву
$current = &$current[$keys[$i]];
}
// Создаем ключ (значение)
$current[$keys[count($keys) - 1]] = $value;
}
// Подключаем методы чтения JSON
use JsonReWriterReadTrait;
}

View File

@ -2,7 +2,7 @@
## Информация о версии ## Информация о версии
Версия класса: 1.2 Версия класса: 1.1
Впервые введено в пакет с версии: 1.0.24 Впервые введено в пакет с версии: 1.0.24
Последнее обновление в версии: 1.0.27 Последнее обновление в версии: 1.0.27
@ -371,49 +371,3 @@
В результате на экране появится: В результате на экране появится:
false|true|false false|true|false
#### Метод `MinVersion`
Введено в версии `1.0.28`.
Этот **статический** метод **без параметров** возвращает минимальную версию (объект класса `VersionInfo`).
Синтаксис:
public static function MinVersion (): VersionInfo
Пример,
// Создаю объекты
$version = VersionInfo::MinVersion();
// Вывожу
echo $version;
В результате на экране появится:
0.0.0.0 PreAlpha 0
#### Метод `MaxVersion`
Введено в версии `1.0.28`.
Этот **статический** метод **без параметров** возвращает максимальную версию (объект класса `VersionInfo`).
Синтаксис:
public static function MaxVersion (): VersionInfo
Пример,
// Создаю объекты
$version = VersionInfo::MaxVersion();
// В этом примере считается, что константа PHP_INT_MAX равна 9223372036854775807
// Вывожу
echo $version;
В результате на экране появится:
9223372036854775807.9223372036854775807.9223372036854775807.9223372036854775807

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.2 * @version 1.1
* @since 1.0.24 * @since 1.0.24
*/ */
final class VersionInfo final class VersionInfo
@ -306,7 +306,6 @@ final class VersionInfo
* @return int Возвращает 1, если текущая версия старше интервала, 0, если находится в интервале, -1, если текущая * @return int Возвращает 1, если текущая версия старше интервала, 0, если находится в интервале, -1, если текущая
* версия младше интервала. * версия младше интервала.
* *
* @version 1.1
* @since 1.0.27 * @since 1.0.27
*/ */
public function CompareWithRange (?VersionInfo $left = null, ?VersionInfo $right = null, public function CompareWithRange (?VersionInfo $left = null, ?VersionInfo $right = null,
@ -318,11 +317,17 @@ final class VersionInfo
VersionCompareRangeOption::RightBorderIncluded 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 ?? self::MinVersion(); $leftBorder = $left ?? $minVersion;
// Устанавливаем правую границу // Устанавливаем правую границу
$rightBorder = $right ?? self::MaxVersion(); $rightBorder = $right ?? $maxVersion;
// Проверяем, что границы не перепутаны // Проверяем, что границы не перепутаны
if ($leftBorder->CompareWith($rightBorder) == 0) if ($leftBorder->CompareWith($rightBorder) == 0)
@ -364,28 +369,4 @@ final class VersionInfo
// -- в противном случае, версия старше правой границы (или равна ей при не включении границы) // -- в противном случае, версия старше правой границы (или равна ей при не включении границы)
return 1; return 1;
} }
/**
* Возвращает минимальную версию.
*
* @return VersionInfo Минимальная версия.
*
* @since 1.0.28
*/
public static function MinVersion (): VersionInfo
{
return new VersionInfo(0, 0, 0, 0, VersionInfoStage::PreAlpha, 0);
}
/**
* Возвращает максимальную версию.
*
* @return VersionInfo Максимальная версия.
*
* @since 1.0.28
*/
public static function MaxVersion (): VersionInfo
{
return new VersionInfo(PHP_INT_MAX, PHP_INT_MAX, PHP_INT_MAX, PHP_INT_MAX, VersionInfoStage::Stable);
}
} }

View File

@ -1,67 +0,0 @@
<?php
namespace goodboyalex\php_components_pack\exceptions;
use Exception;
/**
* Ошибка работы с JSON.
*
* @author Александр Бабаев
* @package php_components_pack
* @version 1.0
* @since 1.1.0
*/
final class JsonException extends Exception
{
/**
* @var string|null $JsonFileName Имя файла JSON.
*/
public ?string $JsonFileName;
/**
* @link https://www.php.net/manual/ru/function.json-last-error.php
* @var int $JsonErrorCode Код ошибки JSON.
*/
public int $JsonErrorCode;
/**
* @link https://www.php.net/manual/ru/function.json-last-error-msg.php
* @var string|null $JsonErrorMessage Сообщение об ошибке JSON.
*
* Внимание! В отличие от функции json_last_error_msg(), данная переменная при отсутствии ошибок выводит null, а не
* "No error".
*/
public ?string $JsonErrorMessage;
/**
* Конструктор.
*
* @param string|null $fileName Имя файла JSON.
* @param int $errorCode Код ошибки JSON.
* @param string|null $errorMessage Сообщение об ошибке JSON.
*/
public function __construct (?string $fileName = null, int $errorCode = JSON_ERROR_NONE,
?string $errorMessage = null)
{
// Если код ошибки JSON равен 0
if ($errorMessage === "No error")
// - то присваиваем ему null для совместимости
$errorMessage = null;
// Сохраняем сообщение об ошибке
$this->JsonErrorMessage = $errorMessage;
// Если сообщение пусто, то присваиваем ему "" для совместимости
$errorMessage = $errorMessage ?? "";
// Запускаем базовый конструктор
parent::__construct($errorMessage);
// Присваиваем имя файла
$this->JsonFileName = $fileName;
// Присваиваем код ошибки
$this->JsonErrorCode = $errorCode;
}
}

View File

@ -1,119 +0,0 @@
<?php
namespace goodboyalex\php_components_pack\traits\JsonReWriter;
/**
* Часть кода класса JsonReWriter, отвечающая за методы чтения ключей и значений JSON.
*
* @author Александр Бабаев
* @package php_components_pack
* @version 1.0
* @since 1.1.0
*/
trait JsonReWriterReadTrait
{
/**
* Читает значение ключа JSON как целое число.
*
* @param string $key Ключ JSON.
* @param int $default Значение по умолчанию.
*
* @return int Значение ключа JSON или значение по умолчанию.
*/
public function ReadInt (string $key, int $default = 0): int
{
return (int)$this->Read($key, $default);
}
/**
* Читает значение ключа JSON.
*
* @param string $key Ключ JSON.
* @param mixed $default Значение по умолчанию.
*
* @return mixed Значение ключа JSON или значение по умолчанию.
*/
public function Read (string $key, mixed $default = null): mixed
{
if (!$this->IsKeyExists($key))
return $default;
$keys = $this->ParseKey($key);
// Получаем текущий массив данных
$current = $this->JsonData;
// Для каждого ключа до предпоследнего
for ($i = 0; $i < count($keys) - 1; $i++)
// - переходим ко вложенному массиву
$current = &$current[$keys[$i]];
// Возвращаем значение последнего ключа и если его нет, то возвращаем значение по умолчанию
return $current[$keys[count($keys) - 1]] ?? $default;
}
/**
* Читает значение ключа JSON как вещественное число.
*
* @param string $key Ключ JSON.
* @param float $default Значение по умолчанию.
*
* @return float Значение ключа JSON или значение по умолчанию.
*/
public function ReadFloat (string $key, float $default = 0.0): float
{
return (float)$this->Read($key, $default);
}
/**
* Читает значение ключа JSON как логическое значение.
*
* @param string $key Ключ JSON.
* @param bool $default Значение по умолчанию.
*
* @return bool Значение ключа JSON или значение по умолчанию.
*/
public function ReadBool (string $key, bool $default = false): bool
{
return (bool)$this->Read($key, $default);
}
/**
* Читает значение ключа JSON как массив.
*
* @param string $key Ключ JSON.
* @param array $default Значение по умолчанию.
*
* @return array Значение ключа JSON или значение по умолчанию.
*/
public function ReadArray (string $key, array $default = []): array
{
return (array)$this->Read($key, $default);
}
/**
* Читает значение ключа JSON как объект.
*
* @param string $key Ключ JSON.
* @param object $default Значение по умолчанию.
*
* @return object Значение ключа JSON или значение по умолчанию.
*/
public function ReadObject (string $key, object $default): object
{
return (object)$this->Read($key, $default);
}
/**
* Читает значение ключа JSON как строку.
*
* @param string $key Ключ JSON.
* @param string $default Значение по умолчанию.
*
* @return string Значение ключа JSON или значение по умолчанию.
*/
public function ReadString (string $key, string $default = ""): string
{
return (string)$this->Read($key, $default);
}
}

View File

@ -1,32 +0,0 @@
<?php
namespace goodboyalex\php_components_pack\tests\classes;
use goodboyalex\php_components_pack\classes\JsonReWriter;
use PHPUnit\Framework\TestCase;
class JsonReWriterTest extends TestCase
{
public function testSaveToFile ()
{
$this->PrepareForTest();
$json = new JsonReWriter();
$json->CreateKey("test/subtest/AAA", "123");
var_dump($json->JsonData);
//$json->SaveToFile(__DIR__ . '/test.json');
}
private function PrepareForTest (): void
{
require_once __DIR__ . '/../../sources/exceptions/JsonException.php';
require_once __DIR__ . '/../../sources/classes/JsonReWriter.php';
}
public function testLoadFromFile ()
{
}
}