From 436c10212a162ffd7c603a5de4f8b62db87b6717 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20Hakan=20Y=C4=B1ld=C4=B1r=C4=B1m?= Date: Tue, 3 Nov 2026 00:04:13 +0300 Subject: [PATCH] Add Emails class for email validation and storage --- Week05/Week05/emails_ahmet_hakan_yildirim.py | 25 ++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 Week05/Week05/emails_ahmet_hakan_yildirim.py diff --git a/Week05/Week05/emails_ahmet_hakan_yildirim.py b/Week05/Week05/emails_ahmet_hakan_yildirim.py new file mode 100644 index 00000000..f2f8182e --- /dev/null +++ b/Week05/Week05/emails_ahmet_hakan_yildirim.py @@ -0,0 +1,25 @@ +import re + +PATTERN = r"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z]{2,}" + + +class Emails(list): + def __init__(self, addresses: list) -> None: + self.data = self.validate(addresses) + list.__init__(self, self.data) + + @classmethod + def validate(cls, addresses: list) -> list: + if not all(isinstance(a, str) for a in addresses): + raise ValueError("All e-mail addresses must be strings") + for a in addresses: + if re.fullmatch(PATTERN, a) is None: + raise ValueError(f"Not a valid e-mail address: {a}") + # dict.fromkeys removes duplicates and keeps the order + return list(dict.fromkeys(addresses)) + + def __repr__(self) -> str: + return f"{self.__class__.__name__}({self.data})" + + def __str__(self) -> str: + return f"{len(self.data)} e-mail(s): " + " | ".join(self.data)