From 7dffd6cfc7ac132b840b8978c2e7298acd9478a7 Mon Sep 17 00:00:00 2001 From: Esra Sepik Date: Wed, 28 Oct 2026 04:41:00 -0700 Subject: [PATCH] Add Emails class for email validation and storage --- Week05/emails_esra_sepik.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 Week05/emails_esra_sepik.py diff --git a/Week05/emails_esra_sepik.py b/Week05/emails_esra_sepik.py new file mode 100644 index 000000000..f2f8182ee --- /dev/null +++ b/Week05/emails_esra_sepik.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)