20251002-2

This commit is contained in:
2025-10-02 23:36:28 +03:00
parent 3065185aa8
commit 3eb7f2e398
12 changed files with 282 additions and 66 deletions

View File

@@ -0,0 +1,17 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Тест StringExtension" type="tests" factoryName="Autodetect">
<module name="anb_python_components" />
<option name="ENV_FILES" value="" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/tests/extensions" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="_new_additionalArguments" value="&quot;&quot;" />
<option name="_new_target" value="&quot;$PROJECT_DIR$/tests/extensions/string_extension_test.py&quot;" />
<option name="_new_targetType" value="&quot;PATH&quot;" />
<method v="2" />
</configuration>
</component>

View File

@@ -1,3 +1 @@
# anb_python_components/__init__.py # anb_python_components/__init__.py
from . import greet

View File

@@ -0,0 +1 @@
# anb_python_components/enums/__init__.py

View File

@@ -0,0 +1,25 @@
# anb_python_components/enums/not_bool_action.py
from enum import Enum
class NotBoolAction(Enum):
"""
Перечисление типов действий, которые необходимо выполнить, если переменная не является булевым типом.
- IGNORE: Игнорировать это утверждение.
- IT_TRUE: Считать это утверждение истинным.
- IT_FALSE: Считать это утверждение ложным.
- RAISE: Вызвать исключение.
"""
# Игнорировать это утверждение.
IGNORE = 0
# Считать это утверждение истинным.
IT_TRUE = 1
# Считать это утверждение ложным.
IT_FALSE = 2
# Вызвать исключение
RAISE = 3

View File

@@ -0,0 +1,81 @@
# anb_python_components/extensions/bool_extension.py
from anb_python_components.enums.not_bool_action import NotBoolAction
class BoolExtension:
"""
Расширение типа "правда/ложь".
"""
def __init__(self):
pass
@staticmethod
def to_str(b: bool, if_true: str = "True", if_false: str = "False") -> str:
"""
Конвертирует булево значение в строку.
:param b: Булево значение.
:param if_true: Возвращаемое значение, если b == True (по умолчанию "True")
:param if_false: Возвращаемое значение, если b == False (по умолчанию "False")
:return: Строка, соответствующая булевому значению.
"""
return if_true if b else if_false
@staticmethod
def true_count(expressions: list[bool], if_not_bool: NotBoolAction = NotBoolAction.IGNORE) -> int:
"""
Возвращает количество истинных значений в списке аргументов.
:param expressions: Список аргументов.
:param if_not_bool: Действие при не булевом значении.
:return: Количество истинных значений в списке аргументов.
"""
# Создаем пустой массив для хранения проверяемых аргументов
check_array = []
# Проверяем все входящие аргументы
for expression in expressions:
# - если аргумент не является типом правда/ложь
if not isinstance(expression, bool):
# -- если указано действие при не булевом значении - игнорирование
if if_not_bool == NotBoolAction.IGNORE:
# - игнорируем аргумент и продолжаем цикл
continue
# -- если указано действие при не булевом значении - считать как истинное значение
if if_not_bool == NotBoolAction.IT_TRUE:
# --- добавляем True в массив проверяемых аргументов
check_array.append(True)
# --- и продолжаем цикл
continue
# -- если указано действие при не булевом значении - считать как ложное значение
if if_not_bool == NotBoolAction.IT_TRUE:
# --- добавляем False в массив проверяемых аргументов
check_array.append(False)
# --- и продолжаем цикл
continue
# -- если указано действие при не булевом значении - выбросить исключение
if if_not_bool == NotBoolAction.RAISE:
# --- то вызываем исключение
raise ValueError(f"{expression} не является булевым значением")
else:
# - иначе добавляем аргумент в массив проверяемых аргументов
check_array.append(expression)
# Используем фильтрацию массива для получения массива только истинных значений
filtered = [value for value in check_array if value]
# Возвращаем количество истинных значений в отфильтрованном массиве
return len(filtered)
@staticmethod
def any_true(expressions: list[bool]) -> int:
"""
Возвращает количество истинных значений в списке аргументов.
:param expressions: Список аргументов.
:return: Количество истинных значений в списке аргументов.
"""
return 0 if len(expressions) == 0 else BoolExtension.true_count(expressions, NotBoolAction.IGNORE)

View File

@@ -1,7 +1,7 @@
# anb_python_components/extensions/string_extension.py # anb_python_components/extensions/string_extension.py
import re import re
from string_extension_constant import StringExtensionConstants from .string_extension_constant import StringExtensionConstants
class StringExtension: class StringExtension:
@@ -16,7 +16,7 @@ class StringExtension:
pass pass
@staticmethod @staticmethod
def is_none_or_empty(text: str) -> bool: def is_none_or_empty(text: str | None) -> bool:
""" """
Проверяет, пуста ли строка. Проверяет, пуста ли строка.
:param text: Проверяемая строка. :param text: Проверяемая строка.
@@ -25,7 +25,7 @@ class StringExtension:
return text is None or text == "" return text is None or text == ""
@classmethod @classmethod
def is_none_or_whitespace(cls, text: str) -> bool: def is_none_or_whitespace(cls, text: str | None) -> bool:
""" """
Проверяет, пуста ли строка, содержит ли вместо текста только пробелы. Проверяет, пуста ли строка, содержит ли вместо текста только пробелы.
:param text: Проверяемая строка. :param text: Проверяемая строка.
@@ -50,22 +50,21 @@ class StringExtension:
:param letter: Буква русского алфавита. :param letter: Буква русского алфавита.
:return: Транслитерированная буква. :return: Транслитерированная буква.
""" """
# Если размерность массивов разная
if (len(StringExtensionConstants.russian_letters) != try:
len(StringExtensionConstants.russian_letters_transliteration)): # Получаю транслитерированную букву
# - то вывожу ошибку transliteration = StringExtensionConstants.russian_letters[letter]
# Если не удалось получить транслитерированную букву
if transliteration is None:
# - то возбуждаю исключение
raise KeyError
except KeyError:
# Если возбуждено исключение, то возвращаю None
return None return None
# Получаю индекс буквы # Возвращаю транслитерированную букву
ind = StringExtensionConstants.russian_letters.find(letter) return transliteration
# Если индекс буквы не найден
if ind == -1:
# - то вывожу ошибку
return None
# Получаю транслитерированную букву
return StringExtensionConstants.russian_letters[ind]
@classmethod @classmethod
def convert_to_latin(cls, source: str) -> str: def convert_to_latin(cls, source: str) -> str:

View File

@@ -4,19 +4,77 @@
class StringExtensionConstants: class StringExtensionConstants:
""" """
Константы для расширения строк. Константы для расширения строк.
Attributes:
russian_letters (dict): Словарь соответствия русских букв в транслитерации.
""" """
# Кортеж из русских букв # Словарь соответствия русских букв в транслитерации
russian_letters = ('а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', russian_letters = {
'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'а': 'a',
'э', 'ю', 'я', 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'б': 'b',
'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'в': 'v',
'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я') 'г': 'g',
'д': 'd',
# Кортеж из русских букв в транслитерации 'е': 'e',
russian_letters_transliteration = ("a", "b", "v", "g", "d", "e", "yo", "zh", "z", "i", "j", 'ё': 'yo',
"k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", 'ж': 'zh',
"h", "c", "ch", "sh", "sch", "j", "i", "j", "e", "yu", "ya", 'з': 'z',
"A", "B", "V", "G", "D", "E", "Yo", "Zh", "Z", "I", "J", 'и': 'i',
"K", "L", "M", "N", "O", "P", "R", "S", "T", "U", "F", 'й': 'j',
"H", "C", "Ch", "Sh", "Sch", "J", "I", "J", "E", "Yu", "Ya") 'к': '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'
}

View File

@@ -7,10 +7,10 @@
## Основная информация ## Основная информация
**Имя файла**: anb_python_components\extensions\string_extension.py - **Имя файла**: anb_python_components\extensions\string_extension.py
**Автор**: Александр Бабаев - **Автор**: Александр Бабаев
**Версия**: 1.0.0 - **Версия**: 1.0.0
**Дата начала поддержки**: с версии 1.0 - **Дата начала поддержки**: с версии 1.0
## Атрибуты и методы класса ## Атрибуты и методы класса

View File

@@ -3,9 +3,9 @@
Этот класс предназначен для хранения констант, используемых при расширениях функционала работы со строками на Python. Этот класс предназначен для хранения констант, используемых при расширениях функционала работы со строками на Python.
Основные цели класса включают поддержку русской транслитерации и удобство обработки текста на кириллице. Основные цели класса включают поддержку русской транслитерации и удобство обработки текста на кириллице.
Класс включает два основных атрибута-константы: Класс включает один основной атрибут-константу:
* атрибут `russian_letters`;
* атрибут `russian_letters_transliteration`. * атрибут `russian_letters`.
## Основная информация ## Основная информация
@@ -15,11 +15,14 @@
- **Дата начала поддержки**: с версии 1.0 - **Дата начала поддержки**: с версии 1.0
## Атрибуты и методы класса ## Атрибуты и методы класса
### Атрибут `russian_letters` ### Атрибут `russian_letters`
Это кортеж, содержащий все русские буквы (строчные и прописные). Используется для проверки принадлежности символов
русским буквам, операций сортировки и фильтрации текста. Это словарь, содержащий все русские буквы (строчные и прописные) и их транслитерацию. Используется для проверки
принадлежности символов русским буквам, операций сортировки и фильтрации текста и транслитерации слов.
Пример использования: Пример использования:
```python ```python
from anb_python_components.extensions.string_extension_constant import StringExtensionConstants from anb_python_components.extensions.string_extension_constant import StringExtensionConstants
@@ -29,29 +32,6 @@ if char in StringExtensionConstants.russian_letters:
print("Символ является русской буквой") print("Символ является русской буквой")
``` ```
### Атрибут `russian_letters_transliteration`
Это кортеж, соответствующий русскому алфавиту в транслитерированном виде латиницей. Например, русская буква «А»
соответствует английскому символу «A», а буква «Ч» соответствует последовательности «Ch».
Используется для преобразования русского текста в транслитерационный вид, что полезно для интеграции с международными
системами, упрощения экспорта данных и поддержки кросс-платформенных решений.
Пример использования:
```python
from anb_python_components.extensions.string_extension_constant import StringExtensionConstants
translit_map = dict(
zip(
StringExtensionConstants.russian_letters,
StringExtensionConstants.russian_letters_transliteration
))
def transliterate(text):
return ''.join(translit_map.get(char, char) for char in text)
```
## Вывод ## Вывод
Таким образом, этот класс позволяет легко реализовать базовые операции для нормализации и трансформации строки на Таким образом, этот класс позволяет легко реализовать базовые операции для нормализации и трансформации строки на

1
tests/__init__.py Normal file
View File

@@ -0,0 +1 @@
# anb_python_components/__init__.py

View File

@@ -0,0 +1 @@
# anb_python_components/extensions/__init__.py

View File

@@ -0,0 +1,55 @@
# string_extension_test.py
import unittest
from anb_python_components.extensions.string_extension import *
class StringExtensionTest(unittest.TestCase):
def test_is_none_or_empty(self):
self.assertTrue(StringExtension.is_none_or_empty(None))
self.assertTrue(StringExtension.is_none_or_empty(""))
self.assertFalse(StringExtension.is_none_or_empty("Некий текст"))
self.assertFalse(StringExtension.is_none_or_empty(" "))
def test_is_none_or_whitespace(self):
self.assertTrue(StringExtension.is_none_or_whitespace(None))
self.assertTrue(StringExtension.is_none_or_whitespace(""))
self.assertFalse(StringExtension.is_none_or_whitespace("Некий текст"))
self.assertTrue(StringExtension.is_none_or_whitespace(" "))
def test_is_russian_letter(self):
self.assertTrue(StringExtension.is_russian_letter('п'))
self.assertFalse(StringExtension.is_russian_letter("p"))
def test_get_russian_letter_transliteration(self):
self.assertEqual(StringExtension.get_russian_letter_transliteration('Ю'), 'Yu')
self.assertNotEqual(StringExtension.get_russian_letter_transliteration('я'), 'Yu')
def test_convert_to_latin(self):
self.assertEqual(StringExtension.convert_to_latin('Россия'), 'Rossiya')
def test_compare(self):
self.assertEqual(StringExtension.compare('Россия', 'Россия'), 0)
self.assertEqual(StringExtension.compare('Россия', 'Россия', True), 0)
self.assertEqual(StringExtension.compare('Россия', 'россия', True), 0)
self.assertEqual(StringExtension.compare('Россия', 'россия'), 1)
self.assertEqual(StringExtension.compare('Россия - Великая держава', 'Россия'), 1)
self.assertEqual(StringExtension.compare('Россия', 'Россия, мы гордимся Тобою'), -1)
def test_get_short_text(self):
self.assertEqual(StringExtension.get_short_text('Я люблю Python', 10), 'Я люблю Py')
self.assertEqual(StringExtension.get_short_text('Я люблю Python', 10, '...'), 'Я люблю...')
def test_replace(self):
self.assertEqual(StringExtension.replace('Я люблю Python. Хотя только изучаю сам Python', 'Python', 'PHP'),
"Я люблю PHP. Хотя только изучаю сам PHP")
def test_replace_all(self):
self.assertEqual(StringExtension.replace_all({'Python': 'PHP', 'сам': 'последнюю версию'},
'Я люблю Python. Хотя только изучаю сам Python'),
"Я люблю PHP. Хотя только изучаю последнюю версию PHP")
if __name__ == '__main__':
unittest.main()