add surname separators support

This commit is contained in:
2026-04-01 14:33:43 +07:00
parent bf998388e9
commit 7a53cda294
+36 -4
View File
@@ -1,8 +1,11 @@
import math import math
from decimal import Decimal, InvalidOperation from decimal import Decimal, InvalidOperation
import unicodedata
class Worker: class Worker:
SURNAME_SEPARATORS = {"-", "'"}
def __init__(self, surname: str, position: str, salary: float): def __init__(self, surname: str, position: str, salary: float):
self.surname = None self.surname = None
self.position = None self.position = None
@@ -18,12 +21,41 @@ class Worker:
@staticmethod @staticmethod
def validate_surname(surname: str) -> str: def validate_surname(surname: str) -> str:
surname = surname.strip() surname = unicodedata.normalize("NFKC", surname.strip())
surname = surname.replace("", "'").replace("`", "'").replace("", "-")
if len(surname) < 2: if len(surname) < 2:
raise ValueError("Фамилия слишком короткая") raise ValueError("Фамилия слишком короткая")
if not surname.isalpha():
raise ValueError("Фамилия должна содержать только буквы") if surname[0] in Worker.SURNAME_SEPARATORS or surname[-1] in Worker.SURNAME_SEPARATORS:
return surname.capitalize() raise ValueError("Фамилия не может начинаться или заканчиваться разделителем")
previous_is_separator = False
for char in surname:
if char in Worker.SURNAME_SEPARATORS:
if previous_is_separator:
raise ValueError("Фамилия содержит подряд идущие разделители")
previous_is_separator = True
continue
if not char.isalpha():
raise ValueError("Фамилия может содержать только буквы, дефис и апостроф")
previous_is_separator = False
parts: list[str] = []
token = ""
for char in surname:
if char in Worker.SURNAME_SEPARATORS:
parts.append(token)
parts.append(char)
token = ""
else:
token += char
parts.append(token)
normalized_parts = [part[:1].upper() + part[1:].lower() if part not in Worker.SURNAME_SEPARATORS else part for part in parts]
return "".join(normalized_parts)
# проверка должности # проверка должности
def set_position(self, position: str): def set_position(self, position: str):