Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.10/site-packages/pycares/utils.py: 13%

Shortcuts on this page

r m x   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

39 statements  

1 

2from typing import Union 

3 

4try: 

5 import idna as idna2008 

6except ImportError: 

7 idna2008 = None 

8 

9 

10def ascii_bytes(data): 

11 if isinstance(data, str): 

12 return data.encode('ascii') 

13 if isinstance(data, bytes): 

14 return data 

15 raise TypeError('only str (ascii encoding) and bytes are supported') 

16 

17 

18def maybe_str(data): 

19 if isinstance(data, str): 

20 return data 

21 if isinstance(data, bytes): 

22 try: 

23 return data.decode('ascii') 

24 except UnicodeDecodeError: 

25 return data 

26 raise TypeError('only str (ascii encoding) and bytes are supported') 

27 

28 

29def parse_name_idna2008(name: str) -> str: 

30 parts = name.split('.') 

31 r = [] 

32 for part in parts: 

33 if part.isascii(): 

34 r.append(part.encode('ascii')) 

35 else: 

36 r.append(idna2008.encode(part)) 

37 return b'.'.join(r) 

38 

39 

40def parse_name(name: Union[str, bytes]) -> bytes: 

41 if isinstance(name, str): 

42 if name.isascii(): 

43 return name.encode('ascii') 

44 if idna2008 is not None: 

45 return parse_name_idna2008(name) 

46 return name.encode('idna') 

47 if isinstance(name, bytes): 

48 return name 

49 raise TypeError('only str and bytes are supported') 

50 

51 

52__all__ = ['ascii_bytes', 'maybe_str', 'parse_name'] 

53