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

1import functools 

2from typing import Annotated 

3 

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 

9 

10from polar.config import settings 

11 

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 

14 

15_email_dns_resolver = caching_resolver() 

16 

17validate_email = functools.partial( 

18 _validate_email, check_deliverability=True, dns_resolver=_email_dns_resolver 

19) 

20 

21 

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 

33 

34 

35EmailStrDNS = Annotated[EmailStr, AfterValidator(_validate_email_dns)] 

36 

37 

38__all__ = ["EmailNotValidError", "validate_email", "EmailStrDNS"]