Coverage for src/pyensae/sql/type_helpers.py: 100%

28 statements  

« prev     ^ index     » next       coverage.py v7.2.7, created at 2023-07-03 02:16 +0200

1""" 

2@file 

3@brief helpers about python types 

4""" 

5 

6import decimal 

7 

8 

9def guess_type_value(x, none=None): 

10 """ 

11 Guesses the type of a value. 

12 

13 @param x type 

14 @param none if True and all values are empty, return None 

15 @return type 

16 

17 @warning if an integer starts with a zero, then it is a string. 

18 """ 

19 if x is None: 

20 return none 

21 try: 

22 int(x) 

23 if isinstance(x, str) and x[0] == '0' and len(x) > 1: 

24 return str 

25 else: 

26 return int if isinstance(x, int) or len(x) < 9 else str 

27 except (ValueError, TypeError): 

28 try: 

29 x = float(x) 

30 return float 

31 except ValueError: 

32 if none: # pragma: no cover 

33 if x is None: 

34 return None 

35 try: 

36 if len(x) > 0: 

37 return str 

38 else: 

39 return None 

40 except Exception: 

41 return None 

42 else: 

43 return str 

44 

45 

46def guess_type_value_type(none=True): 

47 """ 

48 @param none if True and all values are empty, return None 

49 @return the list of types recognized by guess_type_value 

50 """ 

51 return [None, str, int, float] if none else [str, int, float] 

52 

53 

54def get_default_value_type(ty, none=True): 

55 """ 

56 @param ty type in guess_type_value_type 

57 @param none if True and all values are empty, return None 

58 @return a default value for this type 

59 """ 

60 if ty is None and none: 

61 return None 

62 elif ty == str: 

63 return "" 

64 elif ty == int: 

65 return 0 

66 elif ty == decimal.Decimal: 

67 return decimal.Decimal(0) 

68 elif ty == float: 

69 return 0.0 

70 else: 

71 raise TypeError( # pragma: no cover 

72 "type expected in " + str(guess_type_value_type()))