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
« 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"""
6import decimal
9def guess_type_value(x, none=None):
10 """
11 Guesses the type of a value.
13 @param x type
14 @param none if True and all values are empty, return None
15 @return type
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
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]
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()))