add surname separators support
This commit is contained in:
+36
-4
@@ -1,8 +1,11 @@
|
||||
import math
|
||||
from decimal import Decimal, InvalidOperation
|
||||
import unicodedata
|
||||
|
||||
|
||||
class Worker:
|
||||
SURNAME_SEPARATORS = {"-", "'"}
|
||||
|
||||
def __init__(self, surname: str, position: str, salary: float):
|
||||
self.surname = None
|
||||
self.position = None
|
||||
@@ -18,12 +21,41 @@ class Worker:
|
||||
|
||||
@staticmethod
|
||||
def validate_surname(surname: str) -> str:
|
||||
surname = surname.strip()
|
||||
surname = unicodedata.normalize("NFKC", surname.strip())
|
||||
surname = surname.replace("’", "'").replace("`", "'").replace("−", "-")
|
||||
|
||||
if len(surname) < 2:
|
||||
raise ValueError("Фамилия слишком короткая")
|
||||
if not surname.isalpha():
|
||||
raise ValueError("Фамилия должна содержать только буквы")
|
||||
return surname.capitalize()
|
||||
|
||||
if surname[0] in Worker.SURNAME_SEPARATORS or surname[-1] in Worker.SURNAME_SEPARATORS:
|
||||
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):
|
||||
|
||||
Reference in New Issue
Block a user