diff --git a/.run/Тест GUID.run.xml b/.run/Тест GUID.run.xml
new file mode 100644
index 0000000..3647a2e
--- /dev/null
+++ b/.run/Тест GUID.run.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.run/Тест TwoDimSize.run.xml b/.run/Тест TwoDimSize.run.xml
new file mode 100644
index 0000000..c704c15
--- /dev/null
+++ b/.run/Тест TwoDimSize.run.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/anb_python_components/types/two_dim_size.py b/anb_python_components/types/two_dim_size.py
index 0da07b3..0339a3a 100644
--- a/anb_python_components/types/two_dim_size.py
+++ b/anb_python_components/types/two_dim_size.py
@@ -59,12 +59,12 @@ class TwoDimSize:
"""
# Если некорректно заданы минимальные и максимальные значения ширины
- if min_width > max_width:
+ if min_width is not None and max_width is not None and min_width > max_width:
# - то выбрасываю исключение
raise ValueError("Минимальная ширина не может быть больше максимальной.")
# Если некорректно заданы минимальные и максимальные значения высоты
- elif min_height > max_height:
+ elif min_height is not None and max_height is not None and min_height > max_height:
# - то выбрасываю исключение
raise ValueError("Минимальная высота не может быть больше максимальной.")
diff --git a/help/class_desc/types/guid.md b/help/class_desc/types/guid.md
index c6301b1..56a26ee 100644
--- a/help/class_desc/types/guid.md
+++ b/help/class_desc/types/guid.md
@@ -1,4 +1,4 @@
-# Класс `GUID`
+# Тип `GUID`
Класс `GUID` представляет реализацию уникального глобального идентификатора (Global Unique Identifier), широко
применяемого в разработке программного обеспечения для уникальной идентификации сущностей. Данный класс добавляет
diff --git a/help/class_desc/types/two_dim_size.md b/help/class_desc/types/two_dim_size.md
index fe09b7a..543ff27 100644
--- a/help/class_desc/types/two_dim_size.md
+++ b/help/class_desc/types/two_dim_size.md
@@ -1,4 +1,4 @@
-# Класс `TwoDimSize`
+# Тип `TwoDimSize`
Класс `TwoDimSize` предназначен для работы с двумерными размерами, такими как ширина и высота. Он предоставляет ряд
инструментов для эффективного управления и обработки размеров, включая ограничение минимальных/максимальных границ,
diff --git a/help/class_desc/types/version_info.md b/help/class_desc/types/version_info.md
new file mode 100644
index 0000000..9157755
--- /dev/null
+++ b/help/class_desc/types/version_info.md
@@ -0,0 +1,108 @@
+# Тип `VersionInfo`
+
+Класс `VersionInfo` предназначен для эффективной работы с версиями программного обеспечения, обеспечивая гибкую
+структуру и удобные механизмы для представления, сопоставления и форматирования версий.
+
+## Основная информация
+
+- **Имя файла**: anb_python_components\types\version_info.py
+- **Автор**: Александр Бабаев
+- **Версия**: 1.0.0
+- **Дата начала поддержки**: с версии 1.0
+
+## Атрибуты и методы класса
+
+### Конструктор (`__init__`)
+
+Конструктор принимает обязательные и необязательные параметры для детализации версии:
+
+- `major: int`: Майор-версия (обязательно).
+- `minor: int`: Минор-версия (обязательно).
+- `release: int`: Релиз-версия (обязательно).
+- `build: int`: Номер билда (обязательно).
+- `stage: str = ''`: Текущая стадия жизненного цикла продукта (например, альфа, бета, RC).
+- `stage_number: int = 0`: Номер этапа развития (по умолчанию 0).
+
+Пример использования:
+
+```python
+from anb_python_components.types.version_info import VersionInfo
+
+version = VersionInfo(1, 2, 3, 4, "beta", 1)
+```
+
+### Свойства
+
+- `major: int`, `minor: int`, `release: int`, `build: int`: Числовые составляющие версии, доступные как для чтения, так
+ и для записи.
+- `stage: str`: Строковое свойство, характеризующее этап разработки (альфа, бета и т.п.).
+- `stage_number: int`: Целевое свойство, отражающее номер стадии.
+
+### Основные методы
+
+#### Метод `to_string`
+
+Преобразует версию в строку с использованием шаблона, указанного в параметрах. По умолчанию выводит стандартный формат.
+
+**Пример использования**:
+
+```python
+from anb_python_components.types.version_info import VersionInfo
+
+version = VersionInfo(1, 2, 3, 4, "RC", 1)
+print(version.to_string()) # 1.2.3.4 RC 1
+```
+
+#### Метод `in_range`
+
+Проверяет, попадает ли данная версия в заданный диапазон.
+
+**Пример использования**:
+
+```python
+from anb_python_components.types.version_info import VersionInfo
+
+current_version = VersionInfo(1, 2, 3, 4)
+start_version = VersionInfo(1, 1, 0, 0)
+end_version = VersionInfo(2, 0, 0, 0)
+
+print(current_version.in_range(start = start_version, end = end_version)) # True
+```
+
+#### Метод `parse`
+
+Разбирает строку, содержащую версию, и создаёт экземпляр класса `VersionInfo`.
+
+**Пример использования**:
+
+```python
+from anb_python_components.types.version_info import VersionInfo
+
+version = VersionInfo.parse("1.2.3 beta 1")
+print(version.major) # 1
+print(version.stage) # beta
+```
+
+### Магические методы
+
+- `__str__`, `__repr__`: Форматируют объект в удобочитаемую строку.
+- `__eq__`, `__ne__`, `__lt__`, `__gt__`, `__le__`, `__ge__`: Реализуют операции сравнения
+ версий.
+
+**Пример использования**:
+
+```python
+from anb_python_components.types.version_info import VersionInfo
+
+ver1 = VersionInfo(1, 2, 3, 4)
+ver2 = VersionInfo(1, 2, 3, 5)
+
+print(ver1 < ver2) # True
+```
+
+## Заключение
+
+Класс `VersionInfo` обеспечивает универсальность и простоту работы с версиями продуктов, предоставляя удобные средства
+для форматирования, сравнения и парсинга версий.
+
+[На главную](../../index.md)
\ No newline at end of file
diff --git a/help/index.md b/help/index.md
index 8121d30..72132f8 100644
--- a/help/index.md
+++ b/help/index.md
@@ -44,6 +44,7 @@
- [тип `GUID`](class_desc/types/guid.md)
- [тип `TwoDimSize`](class_desc/types/two_dim_size.md)
+- [тип `VersionInfo`](class_desc/types/version_info.md)
### Модели
diff --git a/tests/types/guid_test.py b/tests/types/guid_test.py
index bf63a82..025c7bf 100644
--- a/tests/types/guid_test.py
+++ b/tests/types/guid_test.py
@@ -1,78 +1,14 @@
-# anb_python_components/types/guid.py
-import re
+# guid_test.py
-from anb_python_components.exceptions.wrong_type_exception import WrongTypeException
+import unittest
-class GUID:
- """
- Тип GUID.
- """
-
- # Константа пустого GUID
- EMPTY: str = "00000000-0000-0000-0000-000000000000"
-
- def __init__ (self, guid = EMPTY):
- """
- Инициализация расширения.
- :param guid: str | GUID - Передаваемый GUID
- """
- # Проверка типа аргумента guid
- # - если аргумент не является строкой
- if not isinstance(guid, str):
- # -- если аргумент является экземпляром GUID
- if isinstance(guid, GUID):
- # - преобразуем его в строку
- guid = str(guid)
- else:
- # -- иначе генерируем исключение
- raise WrongTypeException("Неверный тип аргумента!", "GUID", str(type(guid)), "guid")
+from anb_python_components.types.guid import GUID
+
+class GUIDTest(unittest.TestCase):
+ def test_init (self):
+ guid = GUID('12345678-1234-1234-1234-123456789012', )
- # Проверка GUID на валидность
- if not self.validate_str(guid):
- # и если GUID невалидный, то генерируем исключение
- raise WrongTypeException("Неверный формат GUID!", "GUID", guid, "guid")
-
- # Инициализируем приватный атрибут __value (текстовое представление хранящегося GUID)
- self.__value = guid
-
- def __str__ (self):
- """
- Переопределение метода __str__.
- :return: Текстовое представление GUID.
- """
- return self.__value if self.__value else self.EMPTY
-
- def __eq__ (self, other):
- """
- Переопределение метода __eq__.
- :param other: Объект для сравнения.
- :return: True, если GUID равны, иначе False.
- """
-
- # Если аргумент не является экземпляром GUID
- if not isinstance(other, GUID):
- # - генерируем исключение
- raise WrongTypeException("Неверный тип аргумента!", "GUID", type(other), "other")
-
- # Преобразование второго аргумента в строку
- other_str = str(other)
-
- # Сравниваем строки
- return self.__value == other_str
-
- @staticmethod
- def validate_str (guid: str | None) -> bool:
- """
- Проверка строки на валидность GUID.
- :return: True, если GUID валидный, иначе False.
- """
-
- # Проверка на пустоту
- if not guid:
- return False
-
- # Регулярное выражение для проверки формата GUID
- pattern = r'^[0-9A-Fa-f]{8}-([0-9A-Fa-f]{4}-){3}[0-9A-Fa-f]{12}$'
-
- # Проверка на соответствие формату
- return bool(re.fullmatch(pattern, guid))
\ No newline at end of file
+ self.assertEqual(str(guid), '12345678-1234-1234-1234-123456789012')
+
+if __name__ == '__main__':
+ unittest.main()
\ No newline at end of file
diff --git a/tests/types/two_dim_size_test.py b/tests/types/two_dim_size_test.py
index f7909f9..21a4b31 100644
--- a/tests/types/two_dim_size_test.py
+++ b/tests/types/two_dim_size_test.py
@@ -1 +1,37 @@
-# two_dim_size_test.py
\ No newline at end of file
+# two_dim_size_test.py
+
+import unittest
+
+from anb_python_components.types.two_dim_size import TwoDimSize
+
+class TwoDimSizeTest(unittest.TestCase):
+ def test_init (self):
+ size = TwoDimSize(1, 2)
+
+ self.assertEqual(size.width, 1)
+ self.assertEqual(size.height, 2)
+
+ size = TwoDimSize(1, 5, 3, max_height = 4)
+ self.assertEqual(size.width, 3)
+ self.assertEqual(size.height, 4)
+
+ def test_math (self):
+ size_1 = TwoDimSize(1, 2)
+ size_2 = TwoDimSize(3, 4)
+ size_3 = size_1 + size_2
+
+ self.assertEqual(size_3.width, 4)
+ self.assertEqual(size_3.height, 6)
+
+ self.assertTrue(size_3 == TwoDimSize(4, 6))
+
+ def test_parse (self):
+ str_size = "1x2"
+
+ size = TwoDimSize.parse(str_size, 'x')
+
+ self.assertEqual(size.width, 1)
+ self.assertEqual(size.height, 2)
+
+if __name__ == '__main__':
+ unittest.main()
\ No newline at end of file