add surname separators support
This commit is contained in:
+36
-4
@@ -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):
|
||||||
|
|||||||
Reference in New Issue
Block a user