Coverage for polar/kit/email.py: 91%
20 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 12:42 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 12:42 +0000
1import functools
2from typing import Annotated
4import email_validator
5from email_validator import EmailNotValidError, caching_resolver
6from email_validator import validate_email as _validate_email
7from pydantic import AfterValidator, EmailStr
8from pydantic_core import PydanticCustomError
10from polar.config import settings
12if settings.is_testing(): 12 ↛ 13line 12 didn't jump to line 13 because the condition on line 12 was never true
13 email_validator.TEST_ENVIRONMENT = True
15_email_dns_resolver = caching_resolver()
17validate_email = functools.partial(
18 _validate_email, check_deliverability=True, dns_resolver=_email_dns_resolver
19)
22def _validate_email_dns(email: str) -> str:
23 try:
24 validate_email(email)
25 except EmailNotValidError as e:
26 raise PydanticCustomError(
27 "value_error",
28 "{email} is not a valid email address: {reason}",
29 {"email": email, "reason": str(e)},
30 ) from e
31 else:
32 return email
35EmailStrDNS = Annotated[EmailStr, AfterValidator(_validate_email_dns)]
38__all__ = ["EmailNotValidError", "validate_email", "EmailStrDNS"]