add: LayoutProcessor - обработка едениц измерения (кажется все)

This commit is contained in:
2025-09-22 01:04:38 +03:00
parent c3e65700b1
commit 67c5bd805a
5 changed files with 118 additions and 82 deletions

View File

@@ -98,16 +98,34 @@ LAYOUT_TEST_CASES = [
# --- Единицы измерения (по умолчанию) ---
('ru', "Радиус Солнца — около 696.340 км", f"Радиус Солнца{CHAR_NBSP}— около 696.340{CHAR_NBSP}км"),
('ru', "5 кг.", f"5{CHAR_NBSP}кг."),
('ru', "Доработки проекта стоили 100 тыс. руб.", f"Доработки проекта стоили 100{CHAR_NBSP}тыс.{CHAR_NBSP}руб."),
('ru', "Доработки проекта стоили 100 тыс. руб.", f"Доработки проекта стоили 100{CHAR_NBSP}тыс.{CHAR_THIN_SP}руб."),
('ru', "№ 5", f"{CHAR_NBSP}5"),
('ru', "Договор № 504/2025А", f"Договор №{CHAR_NBSP}504/2025А"),
('ru+en', "Доплата за багаж $ 45.50", f"Доплата за багаж ${CHAR_NBSP}45.50"),
('ru+en', "Инвестиции составили $2.5 млн.", f"Инвестиции составили $2.5{CHAR_NBSP}млн."),
('ru+en', "Инвестиции составили $ 2.5 млн.", f"Инвестиции составили ${CHAR_NBSP}2.5{CHAR_NBSP}млн."),
# Сложные единицы (склеиваются тонкой шпацией, привязываются к числу неразрывным пробелом)
('ru', "Дом 120 кв.м. / Участок 6 сот.", f"Дом 120{CHAR_NBSP}кв.м. / Участок 6{CHAR_NBSP}сот."),
('ru', "Гробик кладут в ямку 2 кв. м.", f"Гробик кладут в ямку 2 кв. м."),
('ru', "500 до н. э.", f"500 до н. э."),
('ru+en', "Хаммурапи (1792 - 1750 до н. э.)", f"Хаммурапи (1792 - 1750 до н. э.)"),
# ('ru', "Дом 120 кв.м. / Участок 6 сот.", f"Дом 120{CHAR_NBSP}кв.м. / Участок 6{CHAR_NBSP}сот."),
# ('ru', "Гробик кладут в ямку 2 кв. м.", f"Гробик кладут в ямку 2 кв. м."),
('ru', "IV-X вв.", f"IV-X{CHAR_NBSP}вв."),
('ru', "IV в. н. э.", f"IV{CHAR_NBSP}в. н.{CHAR_THIN_SP}э."),
('ru+en', "Хаммурапи (1792 - 1750 до н. э.)",
f"Хаммурапи (1792 - 1750 до н.{CHAR_THIN_SP}э.)"),
# Составные и математические единицы
('ru', "Площадь 120 кв. м.", f"Площадь 120{CHAR_NBSP}кв.{CHAR_THIN_SP}м."),
('ru', "Площадь 130 кв.м.", f"Площадь 130{CHAR_NBSP}кв.{CHAR_THIN_SP}м."),
('ru', f"Площадь 140 {CHAR_NBSP} кв.{CHAR_NBSP}м.", f"Площадь 140{CHAR_NBSP}кв.{CHAR_THIN_SP}м."),
('ru', "Площадь 150 тыс. кв. км.", f"Площадь 150{CHAR_NBSP}тыс.{CHAR_THIN_SP}кв.{CHAR_THIN_SP}км."),
('ru', "Скорость 90 км/ч", f"Скорость 90{CHAR_NBSP}км/ч"),
('ru', "Скорость 90 км / ч", f"Скорость 90{CHAR_NBSP}км/ч"),
('ru', "В 500 г. н. э.", f"В 500{CHAR_NBSP}г. н.{CHAR_THIN_SP}э."),
# Сложные единицы (склеиваются тонкой шпацией, привязываются к числу неразрывным пробелом)
('ru', "Дом 120 кв.м. / Участок 6 сот.", f"Дом 120{CHAR_NBSP}кв.{CHAR_THIN_SP}м. / Участок 6{CHAR_NBSP}сот."),
# ('ru', "Гробик кладут в ямку 2 кв. м.", f"Гробик кладут в ямку 2 кв. м."),
('ru', "500 до н. э.", f"500 до н.{CHAR_THIN_SP}э."),
('ru+en', "Хаммурапи (1792 - 1750 до н. э.)", f"Хаммурапи (1792 - 1750 до н.{CHAR_THIN_SP}э.)"),
# --- Комбинированные случаи ---
('ru', f"Да — это так{CHAR_HELLIP} а может и нет. Счёт -10.",

View File

@@ -1,6 +1,7 @@
# tests/test_unbreakables.py
import pytest
from etpgrf import Unbreakables
from etpgrf.config import CHAR_NBSP, CHAR_THIN_SP
# Список русских слов, которые должны "приклеиваться" к следующему слову.
@@ -26,7 +27,7 @@ def test_russian_prepositions_are_unbreakable(word):
# Arrange (подготовка)
unbreakables_ru = Unbreakables(langs='ru')
input_text = f"Проверка {word} тестирование."
expected_text = f"Проверка {word}\u00A0тестирование."
expected_text = f"Проверка {word}{CHAR_NBSP}тестирование."
# Act (действие, которое выполняем)
actual_text = unbreakables_ru.process(input_text)
# Assert (утверждение, что результат соответствует ожиданиям)
@@ -48,7 +49,7 @@ def test_english_prepositions_are_unbreakable(word):
# Arrange (подготовка)
unbreakables_en = Unbreakables(langs='en')
input_text = f"Training {word} test."
expected_text = f"Training {word}\u00A0test."
expected_text = f"Training {word}{CHAR_NBSP}test."
# Act (действие, которое выполняем)
actual_text = unbreakables_en.process(input_text)
# Assert (утверждение, что результат соответствует ожиданиям)
@@ -63,7 +64,7 @@ def test_mix_prepositions_are_unbreakable():
# Arrange (подготовка)
unbreakables_mix = Unbreakables(langs='ru+en')
input_text = f"Для the Guardian он написал блестящую статью."
expected_text = f"Для\u00A0the\u00A0Guardian он\u00A0написал блестящую статью."
expected_text = f"Для{CHAR_NBSP}the{CHAR_NBSP}Guardian он{CHAR_NBSP}написал блестящую статью."
# Act (действие, которое выполняем)
actual_text = unbreakables_mix.process(input_text)
# Assert (утверждение, что результат соответствует ожиданиям)
@@ -83,8 +84,22 @@ def test_russian_postpositive_particle(word):
# Arrange
unbreakables_ru = Unbreakables(langs='ru')
input_text = f"Отчего {word} не поспать?"
expected_text = f"Отчего\u00A0{word} не\u00A0поспать?"
expected_text = f"Отчего{CHAR_NBSP}{word} не{CHAR_NBSP}поспать?"
# Act
actual_text = unbreakables_ru.process(input_text)
# Assert
assert actual_text == expected_text
# Тесты для проверки особых случаев в Unbreakables
UNBREAKABLES_SPECIAL_TEST_CASES = [
('ru', "до н.э.", f"до{CHAR_NBSP}н.э."),
]
@pytest.mark.parametrize("lang, input_string, expected_output", UNBREAKABLES_SPECIAL_TEST_CASES)
def test_layout_processor_with_options(lang, input_string, expected_output):
"""Проверяет работу Unbreakables с особыми случаями. """
processor = Unbreakables(langs=lang)
actual_output = processor.process(input_string)
assert actual_output == expected_output