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

43 statements  

« prev     ^ index     » next       coverage.py v7.2.7, created at 2023-06-07 06:52 +0000

1 

2try: 

3 import idna as idna2008 

4except ImportError: 

5 idna2008 = None 

6 

7 

8def ascii_bytes(data): 

9 if isinstance(data, str): 

10 return data.encode('ascii') 

11 if isinstance(data, bytes): 

12 return data 

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

14 

15 

16def maybe_str(data): 

17 if isinstance(data, str): 

18 return data 

19 if isinstance(data, bytes): 

20 try: 

21 return data.decode('ascii') 

22 except UnicodeDecodeError: 

23 return data 

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

25 

26 

27def is_all_ascii(text): 

28 for c in text: 

29 if ord(c) > 0x7f: 

30 return False 

31 return True 

32 

33def parse_name_idna2008(name): 

34 parts = name.split('.') 

35 r = [] 

36 for part in parts: 

37 if is_all_ascii(part): 

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

39 else: 

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

41 return b'.'.join(r) 

42 

43def parse_name(name): 

44 if isinstance(name, str): 

45 if is_all_ascii(name): 

46 return name.encode('ascii') 

47 if idna2008 is not None: 

48 return parse_name_idna2008(name) 

49 return name.encode('idna') 

50 if isinstance(name, bytes): 

51 return name 

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

53 

54 

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

56