20251004-1
This commit is contained in:
@@ -2,7 +2,6 @@
|
||||
|
||||
from enum import Enum
|
||||
|
||||
|
||||
class NotBoolAction(Enum):
|
||||
"""
|
||||
Перечисление типов действий, которые необходимо выполнить, если переменная не является булевым типом.
|
||||
|
@@ -5,7 +5,7 @@ class WrongTypeException(Exception):
|
||||
Ошибка, возникающая при попытке присвоить значение другого типа данным полям.
|
||||
"""
|
||||
|
||||
def __init__(self, message: str = None, type_name: str = None, real_type_name: str = None, var_name: str = None):
|
||||
def __init__ (self, message: str = None, type_name: str = None, real_type_name: str = None, var_name: str = None):
|
||||
"""
|
||||
Инициализация экземпляра класса WrongTypeException.
|
||||
:param message: Сообщение об ошибке.
|
||||
|
@@ -2,20 +2,19 @@
|
||||
|
||||
from anb_python_components.extensions.string_extension import StringExtension
|
||||
|
||||
|
||||
class ArrayExtension:
|
||||
"""
|
||||
Класс расширения для работы с массивами.
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
def __init__ (self):
|
||||
"""
|
||||
Инициализация расширения.
|
||||
"""
|
||||
pass
|
||||
|
||||
@staticmethod
|
||||
def remove_empties(array: list[str], re_sort: bool = False) -> list[str]:
|
||||
def remove_empties (array: list[str], re_sort: bool = False) -> list[str]:
|
||||
"""
|
||||
Удаляет пустые строки из массива.
|
||||
|
||||
|
@@ -2,20 +2,19 @@
|
||||
|
||||
from anb_python_components.enums.not_bool_action import NotBoolAction
|
||||
|
||||
|
||||
class BoolExtension:
|
||||
"""
|
||||
Расширение типа "правда/ложь".
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
def __init__ (self):
|
||||
"""
|
||||
Инициализация расширения.
|
||||
"""
|
||||
pass
|
||||
|
||||
@staticmethod
|
||||
def to_str(b: bool, if_true: str = "True", if_false: str = "False") -> str:
|
||||
def to_str (b: bool, if_true: str = "True", if_false: str = "False") -> str:
|
||||
"""
|
||||
Конвертирует булево значение в строку.
|
||||
:param b: Булево значение.
|
||||
@@ -26,7 +25,7 @@ class BoolExtension:
|
||||
return if_true if b else if_false
|
||||
|
||||
@staticmethod
|
||||
def true_count(expressions: list[bool], if_not_bool: NotBoolAction = NotBoolAction.IGNORE) -> int:
|
||||
def true_count (expressions: list[bool], if_not_bool: NotBoolAction = NotBoolAction.IGNORE) -> int:
|
||||
"""
|
||||
Возвращает количество истинных значений в списке аргументов.
|
||||
:param expressions: Список аргументов.
|
||||
@@ -75,7 +74,7 @@ class BoolExtension:
|
||||
return len(filtered)
|
||||
|
||||
@staticmethod
|
||||
def any_true(expressions: list[bool]) -> bool:
|
||||
def any_true (expressions: list[bool]) -> bool:
|
||||
"""
|
||||
Проверяет, есть ли хотя бы один истинный аргумент.
|
||||
:param expressions: Выражения.
|
||||
|
@@ -1,23 +1,22 @@
|
||||
# anb_python_components/extensions/guid_extension.py
|
||||
import secrets
|
||||
|
||||
from anb_python_components.classes.guid import GUID, GUID_EMPTY
|
||||
from anb_python_components.exceptions.wrong_type_exception import WrongTypeException
|
||||
|
||||
from anb_python_components.types.guid import GUID
|
||||
|
||||
class GUIDExtension:
|
||||
"""
|
||||
Класс GUIDExtension реализует расширение для работы с GUID.
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
def __init__ (self):
|
||||
"""
|
||||
Инициализация расширения.
|
||||
"""
|
||||
pass
|
||||
|
||||
@staticmethod
|
||||
def generate() -> GUID:
|
||||
def generate () -> GUID:
|
||||
"""
|
||||
Генерирует уникальный идентификатор GUID согласно стандарту RFC 4122.
|
||||
"""
|
||||
@@ -30,37 +29,39 @@ class GUIDExtension:
|
||||
|
||||
# Объединение компонентов в единый GUID
|
||||
guid_parts = [
|
||||
time_low >> 16, time_low & 0xffff,
|
||||
time_mid,
|
||||
time_hi_and_version,
|
||||
clock_seq_hi_and_reserved,
|
||||
node_id >> 32, (node_id >> 16) & 0xffff, node_id & 0xffff
|
||||
]
|
||||
time_low >> 16, time_low & 0xffff,
|
||||
time_mid,
|
||||
time_hi_and_version,
|
||||
clock_seq_hi_and_reserved,
|
||||
node_id >> 32, (node_id >> 16) & 0xffff, node_id & 0xffff
|
||||
]
|
||||
|
||||
# Форматируем компоненты в виде строки GUID
|
||||
guid_str = "-".join([
|
||||
"%08x" % guid_parts[0],
|
||||
"%04x" % guid_parts[1],
|
||||
"%04x" % guid_parts[2],
|
||||
"%04x" % guid_parts[3],
|
||||
("%04x%04x%04x" % tuple(guid_parts[4:])),
|
||||
])
|
||||
guid_str = "-".join(
|
||||
[
|
||||
"%08x" % guid_parts[0],
|
||||
"%04x" % guid_parts[1],
|
||||
"%04x" % guid_parts[2],
|
||||
"%04x" % guid_parts[3],
|
||||
("%04x%04x%04x" % tuple(guid_parts[4:])),
|
||||
]
|
||||
)
|
||||
|
||||
# Возвращаем экземпляр GUID
|
||||
return GUID(guid_str)
|
||||
|
||||
@staticmethod
|
||||
def is_equal(guid1: str | GUID, guid2: str | GUID) -> bool:
|
||||
def is_equal (guid1: str | GUID, guid2: str | GUID) -> bool:
|
||||
|
||||
# Если guid1 не является GUID или строкой
|
||||
if not isinstance(guid1, GUID) or not isinstance(guid1, str):
|
||||
# - генерируем исключение
|
||||
raise WrongTypeException("Неверный тип аргумента!", "GUID|str", var_name="guid1")
|
||||
raise WrongTypeException("Неверный тип аргумента!", "GUID|str", var_name = "guid1")
|
||||
|
||||
# Если guid2 не является GUID или строкой
|
||||
if not isinstance(guid2, GUID) or not isinstance(guid2, str):
|
||||
# - генерируем исключение
|
||||
raise WrongTypeException("Неверный тип аргумента!", "GUID|str", var_name="guid2")
|
||||
raise WrongTypeException("Неверный тип аргумента!", "GUID|str", var_name = "guid2")
|
||||
|
||||
# Если guid1 является строкой
|
||||
if not isinstance(guid1, GUID):
|
||||
@@ -76,7 +77,7 @@ class GUIDExtension:
|
||||
return guid1 == guid2
|
||||
|
||||
@staticmethod
|
||||
def validate(guid: str | GUID) -> bool:
|
||||
def validate (guid: str | GUID) -> bool:
|
||||
"""
|
||||
Проверка GUID на валидность.
|
||||
:param guid: GUID для проверки.
|
||||
@@ -89,7 +90,7 @@ class GUIDExtension:
|
||||
return bool(GUID.validate_str(guid))
|
||||
|
||||
@staticmethod
|
||||
def is_invalid_or_empty(guid: str | GUID) -> bool:
|
||||
def is_invalid_or_empty (guid: str | GUID) -> bool:
|
||||
"""
|
||||
Проверка GUID на валидность и не пустоту.
|
||||
:param guid: Класс или строка GUID для проверки.
|
||||
@@ -99,10 +100,10 @@ class GUIDExtension:
|
||||
guid = guid if isinstance(guid, str) else str(guid)
|
||||
|
||||
# Проверяем GUID
|
||||
return not GUID.validate_str(guid) or guid == GUID_EMPTY
|
||||
return not GUID.validate_str(guid) or GUID(guid) == GUID(GUID.EMPTY)
|
||||
|
||||
@classmethod
|
||||
def parse(cls, guid_string: str, empty_if_not_valid: bool = True) -> GUID:
|
||||
def parse (cls, guid_string: str, empty_if_not_valid: bool = True) -> GUID:
|
||||
"""
|
||||
Парсинг GUID из строки.
|
||||
:param guid_string: Строка GUID.
|
||||
@@ -117,7 +118,7 @@ class GUIDExtension:
|
||||
# Если же GUID недействителен и запрещено выбрасывать исключение
|
||||
if empty_if_not_valid:
|
||||
# -- то возвращаем пустой GUID
|
||||
return GUID(GUID_EMPTY)
|
||||
return GUID(GUID.EMPTY)
|
||||
else:
|
||||
# -- иначе выбрасываем исключение
|
||||
raise WrongTypeException('Предан неверный GUID / Wrong GUID.')
|
@@ -3,20 +3,19 @@ import re
|
||||
|
||||
from .string_extension_constant import StringExtensionConstants
|
||||
|
||||
|
||||
class StringExtension:
|
||||
"""
|
||||
Расширение строк.
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
def __init__ (self):
|
||||
"""
|
||||
Конструктор.
|
||||
"""
|
||||
pass
|
||||
|
||||
@staticmethod
|
||||
def is_none_or_empty(text: str | None) -> bool:
|
||||
def is_none_or_empty (text: str | None) -> bool:
|
||||
"""
|
||||
Проверяет, пуста ли строка.
|
||||
:param text: Проверяемая строка.
|
||||
@@ -25,7 +24,7 @@ class StringExtension:
|
||||
return text is None or text == ""
|
||||
|
||||
@classmethod
|
||||
def is_none_or_whitespace(cls, text: str | None) -> bool:
|
||||
def is_none_or_whitespace (cls, text: str | None) -> bool:
|
||||
"""
|
||||
Проверяет, пуста ли строка, содержит ли вместо текста только пробелы.
|
||||
:param text: Проверяемая строка.
|
||||
@@ -34,7 +33,7 @@ class StringExtension:
|
||||
return cls.is_none_or_empty(text) or text.strip() == ''
|
||||
|
||||
@staticmethod
|
||||
def is_russian_letter(letter: str) -> bool:
|
||||
def is_russian_letter (letter: str) -> bool:
|
||||
"""
|
||||
Проверяет, является ли символ русским буквой.
|
||||
:param letter: Проверяемый символ.
|
||||
@@ -44,7 +43,7 @@ class StringExtension:
|
||||
return letter in StringExtensionConstants.russian_letters
|
||||
|
||||
@staticmethod
|
||||
def get_russian_letter_transliteration(letter: str) -> bool | None:
|
||||
def get_russian_letter_transliteration (letter: str) -> bool | None:
|
||||
"""
|
||||
Получаю транслитерированную букву русского алфавита.
|
||||
:param letter: Буква русского алфавита.
|
||||
@@ -67,7 +66,7 @@ class StringExtension:
|
||||
return transliteration
|
||||
|
||||
@classmethod
|
||||
def convert_to_latin(cls, source: str) -> str:
|
||||
def convert_to_latin (cls, source: str) -> str:
|
||||
"""
|
||||
Конвертация в латиницу.
|
||||
:param source: Исходная строка.
|
||||
@@ -97,7 +96,7 @@ class StringExtension:
|
||||
return result
|
||||
|
||||
@classmethod
|
||||
def compare(cls, str1: str | None, str2: str | None, ignore_case: bool = False) -> int:
|
||||
def compare (cls, str1: str | None, str2: str | None, ignore_case: bool = False) -> int:
|
||||
"""
|
||||
Сравнивает две строки.
|
||||
:param str1: Первая строка.
|
||||
@@ -142,7 +141,7 @@ class StringExtension:
|
||||
return 1 if len1 >= len2 else -1
|
||||
|
||||
@staticmethod
|
||||
def get_short_text(text: str, max_length: int, end_symbols: str = '') -> str:
|
||||
def get_short_text (text: str, max_length: int, end_symbols: str = '') -> str:
|
||||
"""
|
||||
Обрезает строку до указанных в параметре max_length символов.
|
||||
:param text: Исходный текст.
|
||||
@@ -162,7 +161,7 @@ class StringExtension:
|
||||
return text[:len_no_end_symbols] + end_symbols
|
||||
|
||||
@staticmethod
|
||||
def to_utf8(subject: str, encoding: str = 'UTF-8') -> str:
|
||||
def to_utf8 (subject: str, encoding: str = 'UTF-8') -> str:
|
||||
"""
|
||||
Перекодирует строку в UTF-8.
|
||||
:param subject: Исходная строка.
|
||||
@@ -187,7 +186,7 @@ class StringExtension:
|
||||
return utf8_bytes.decode('UTF-8')
|
||||
|
||||
@staticmethod
|
||||
def from_utf8(subject: str, to_encoding: str = 'UTF-8') -> str:
|
||||
def from_utf8 (subject: str, to_encoding: str = 'UTF-8') -> str:
|
||||
"""
|
||||
Перекодирует строку из UTF-8.
|
||||
:param subject: Исходная строка.
|
||||
@@ -206,7 +205,7 @@ class StringExtension:
|
||||
return str(target_bytes.decode('UTF-8').encode(to_encoding))
|
||||
|
||||
@classmethod
|
||||
def replace(cls, subject: str, search: str, replace: str, encoding: str = 'UTF-8') -> str:
|
||||
def replace (cls, subject: str, search: str, replace: str, encoding: str = 'UTF-8') -> str:
|
||||
"""
|
||||
Заменяет в строке все вхождения строки поиска на строку замены.
|
||||
:param subject: Исходная строка.
|
||||
@@ -239,7 +238,7 @@ class StringExtension:
|
||||
return result
|
||||
|
||||
@classmethod
|
||||
def replace_all(cls, search_replace: dict[str, str], subject: str, encoding: str = 'UTF-8') -> str:
|
||||
def replace_all (cls, search_replace: dict[str, str], subject: str, encoding: str = 'UTF-8') -> str:
|
||||
"""
|
||||
Заменяет в строке все вхождения строки поиска на строку замены.
|
||||
:param search_replace: Словарь с парами поиска и замены. Например, {'-': '#', '$': '%'}
|
||||
|
@@ -11,70 +11,70 @@ class StringExtensionConstants:
|
||||
|
||||
# Словарь соответствия русских букв в транслитерации
|
||||
russian_letters = {
|
||||
'а': 'a',
|
||||
'б': 'b',
|
||||
'в': 'v',
|
||||
'г': 'g',
|
||||
'д': 'd',
|
||||
'е': 'e',
|
||||
'ё': 'yo',
|
||||
'ж': 'zh',
|
||||
'з': 'z',
|
||||
'и': 'i',
|
||||
'й': 'j',
|
||||
'к': 'k',
|
||||
'л': 'l',
|
||||
'м': 'm',
|
||||
'н': 'n',
|
||||
'о': 'o',
|
||||
'п': 'p',
|
||||
'р': 'r',
|
||||
'с': 's',
|
||||
'т': 't',
|
||||
'у': 'u',
|
||||
'ф': 'f',
|
||||
'х': 'h',
|
||||
'ц': 'c',
|
||||
'ч': 'ch',
|
||||
'ш': 'sh',
|
||||
'щ': 'sch',
|
||||
'ъ': 'j',
|
||||
'ы': 'i',
|
||||
'ь': 'j',
|
||||
'э': 'e',
|
||||
'ю': 'yu',
|
||||
'я': 'ya',
|
||||
'А': 'A',
|
||||
'Б': 'B',
|
||||
'В': 'V',
|
||||
'Г': 'G',
|
||||
'Д': 'D',
|
||||
'Е': 'E',
|
||||
'Ё': 'Yo',
|
||||
'Ж': 'Zh',
|
||||
'З': 'Z',
|
||||
'И': 'I',
|
||||
'Й': 'J',
|
||||
'К': 'K',
|
||||
'Л': 'L',
|
||||
'М': 'M',
|
||||
'Н': 'N',
|
||||
'О': 'O',
|
||||
'П': 'P',
|
||||
'Р': 'R',
|
||||
'С': 'S',
|
||||
'Т': 'T',
|
||||
'У': 'U',
|
||||
'Ф': 'F',
|
||||
'Х': 'H',
|
||||
'Ц': 'C',
|
||||
'Ч': 'Ch',
|
||||
'Ш': 'Sh',
|
||||
'Щ': 'Sch',
|
||||
'Ъ': 'J',
|
||||
'Ы': 'I',
|
||||
'Ь': 'J',
|
||||
'Э': 'E',
|
||||
'Ю': 'Yu',
|
||||
'Я': 'Ya'
|
||||
}
|
||||
'а': 'a',
|
||||
'б': 'b',
|
||||
'в': 'v',
|
||||
'г': 'g',
|
||||
'д': 'd',
|
||||
'е': 'e',
|
||||
'ё': 'yo',
|
||||
'ж': 'zh',
|
||||
'з': 'z',
|
||||
'и': 'i',
|
||||
'й': 'j',
|
||||
'к': 'k',
|
||||
'л': 'l',
|
||||
'м': 'm',
|
||||
'н': 'n',
|
||||
'о': 'o',
|
||||
'п': 'p',
|
||||
'р': 'r',
|
||||
'с': 's',
|
||||
'т': 't',
|
||||
'у': 'u',
|
||||
'ф': 'f',
|
||||
'х': 'h',
|
||||
'ц': 'c',
|
||||
'ч': 'ch',
|
||||
'ш': 'sh',
|
||||
'щ': 'sch',
|
||||
'ъ': 'j',
|
||||
'ы': 'i',
|
||||
'ь': 'j',
|
||||
'э': 'e',
|
||||
'ю': 'yu',
|
||||
'я': 'ya',
|
||||
'А': 'A',
|
||||
'Б': 'B',
|
||||
'В': 'V',
|
||||
'Г': 'G',
|
||||
'Д': 'D',
|
||||
'Е': 'E',
|
||||
'Ё': 'Yo',
|
||||
'Ж': 'Zh',
|
||||
'З': 'Z',
|
||||
'И': 'I',
|
||||
'Й': 'J',
|
||||
'К': 'K',
|
||||
'Л': 'L',
|
||||
'М': 'M',
|
||||
'Н': 'N',
|
||||
'О': 'O',
|
||||
'П': 'P',
|
||||
'Р': 'R',
|
||||
'С': 'S',
|
||||
'Т': 'T',
|
||||
'У': 'U',
|
||||
'Ф': 'F',
|
||||
'Х': 'H',
|
||||
'Ц': 'C',
|
||||
'Ч': 'Ch',
|
||||
'Ш': 'Sh',
|
||||
'Щ': 'Sch',
|
||||
'Ъ': 'J',
|
||||
'Ы': 'I',
|
||||
'Ь': 'J',
|
||||
'Э': 'E',
|
||||
'Ю': 'Yu',
|
||||
'Я': 'Ya'
|
||||
}
|
@@ -3,21 +3,20 @@
|
||||
import datetime
|
||||
from typing import Any
|
||||
|
||||
|
||||
# Базовая структура для представления расширенного типа
|
||||
class TypeExtension:
|
||||
"""
|
||||
Класс для расширения типов.
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
def __init__ (self):
|
||||
"""
|
||||
Инициализирует экземпляр класса.
|
||||
"""
|
||||
pass
|
||||
|
||||
@staticmethod
|
||||
def to_dict(instance: Any) -> dict[str, Any]:
|
||||
def to_dict (instance: Any) -> dict[str, Any]:
|
||||
"""
|
||||
Преобразует экземпляр объекта в словарь.
|
||||
|
||||
@@ -43,7 +42,7 @@ class TypeExtension:
|
||||
return result
|
||||
|
||||
@staticmethod
|
||||
def from_dict(data: dict, cls=None) -> Any:
|
||||
def from_dict (data: dict, cls = None) -> Any:
|
||||
"""
|
||||
Восстанавливает объект из словаря.
|
||||
|
||||
@@ -58,6 +57,7 @@ class TypeExtension:
|
||||
raise TypeError('Класс для восстановления не указан.')
|
||||
|
||||
# Создаём объект класса
|
||||
# noinspection PyArgumentList
|
||||
obj = cls.__new__(cls)
|
||||
|
||||
# Перебираем поля словаря
|
||||
|
1
anb_python_components/types/__init__.py
Normal file
1
anb_python_components/types/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
# anb_python_components/types/__init__.py
|
@@ -1,19 +1,31 @@
|
||||
# anb_python_components/classes/guid.py
|
||||
# anb_python_components/types/guid.py
|
||||
import re
|
||||
|
||||
from anb_python_components.exceptions.wrong_type_exception import WrongTypeException
|
||||
|
||||
# Константа пустого GUID
|
||||
GUID_EMPTY: str = "00000000-0000-0000-0000-000000000000"
|
||||
|
||||
|
||||
class GUID:
|
||||
"""
|
||||
Тип GUID.
|
||||
"""
|
||||
|
||||
def __init__(self, guid: str = GUID_EMPTY):
|
||||
# Константа пустого GUID
|
||||
EMPTY: str = "00000000-0000-0000-0000-000000000000"
|
||||
|
||||
def __init__ (self, guid = EMPTY):
|
||||
"""
|
||||
Инициализация расширения.
|
||||
:param guid: Передаваемый GUID
|
||||
: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")
|
||||
|
||||
# Проверка GUID на валидность
|
||||
if not self.validate_str(guid):
|
||||
@@ -23,14 +35,14 @@ class GUID:
|
||||
# Инициализируем приватный атрибут __value (текстовое представление хранящегося GUID)
|
||||
self.__value = guid
|
||||
|
||||
def __str__(self):
|
||||
def __str__ (self):
|
||||
"""
|
||||
Переопределение метода __str__.
|
||||
:return: Текстовое представление GUID.
|
||||
"""
|
||||
return self.__value if self.__value else GUID_EMPTY
|
||||
return self.__value if self.__value else self.EMPTY
|
||||
|
||||
def __eq__(self, other):
|
||||
def __eq__ (self, other):
|
||||
"""
|
||||
Переопределение метода __eq__.
|
||||
:param other: Объект для сравнения.
|
||||
@@ -49,7 +61,7 @@ class GUID:
|
||||
return self.__value == other_str
|
||||
|
||||
@staticmethod
|
||||
def validate_str(guid: str | None) -> bool:
|
||||
def validate_str (guid: str | None) -> bool:
|
||||
"""
|
||||
Проверка строки на валидность GUID.
|
||||
:return: True, если GUID валидный, иначе False.
|
Reference in New Issue
Block a user