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