dcicutils 8.13.3.1b20__py3-none-any.whl → 8.13.3.1b23__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- dcicutils/misc_utils.py +24 -17
- dcicutils/structured_data.py +15 -5
- {dcicutils-8.13.3.1b20.dist-info → dcicutils-8.13.3.1b23.dist-info}/METADATA +1 -1
- {dcicutils-8.13.3.1b20.dist-info → dcicutils-8.13.3.1b23.dist-info}/RECORD +7 -7
- {dcicutils-8.13.3.1b20.dist-info → dcicutils-8.13.3.1b23.dist-info}/LICENSE.txt +0 -0
- {dcicutils-8.13.3.1b20.dist-info → dcicutils-8.13.3.1b23.dist-info}/WHEEL +0 -0
- {dcicutils-8.13.3.1b20.dist-info → dcicutils-8.13.3.1b23.dist-info}/entry_points.txt +0 -0
dcicutils/misc_utils.py
CHANGED
@@ -1021,21 +1021,22 @@ _MULTIPLIER_SUFFIXES = {
|
|
1021
1021
|
|
1022
1022
|
def to_number(value: str,
|
1023
1023
|
allow_commas: bool = False,
|
1024
|
-
|
1025
|
-
allow_float: bool = False
|
1024
|
+
allow_multiplier_suffix: bool = False,
|
1025
|
+
allow_float: bool = False,
|
1026
|
+
fallback: Optional[Union[int, float]] = None) -> Optional[Union[int, float]]:
|
1026
1027
|
|
1027
1028
|
"""
|
1028
1029
|
Converts the give string value to an int, or possibly float if allow_float is True.
|
1029
1030
|
If allow_commas is True (default: False) then allow commas (only) every three digits.
|
1030
|
-
If
|
1031
|
-
G, Gb, or GB; or T, Tb, TB, to mean multiply value by one thousand; one million;
|
1031
|
+
If allow_multiplier_suffix is True (default: False) allow any of K, Kb, KB; or M, Mb, MB;
|
1032
|
+
or G, Gb, or GB; or T, Tb, TB, to mean multiply value by one thousand; one million;
|
1032
1033
|
one billion; or one trillion; respectively. If allow_float is True (default: False)
|
1033
1034
|
allow the value to be floating point (i.e. with a decimal point and a fractional part),
|
1034
|
-
in which case the returned value will be of type float
|
1035
|
+
in which case the returned value will be of type float, if it needs to be, and not int.
|
1035
1036
|
If the string is not well formated then returns None.
|
1036
1037
|
"""
|
1037
1038
|
if not (isinstance(value, str) and (value := value.strip())):
|
1038
|
-
return value if isinstance(value, (int, float)) else
|
1039
|
+
return value if isinstance(value, (int, float)) else fallback
|
1039
1040
|
|
1040
1041
|
value_multiplier = 1
|
1041
1042
|
value_negative = False
|
@@ -1043,46 +1044,52 @@ def to_number(value: str,
|
|
1043
1044
|
|
1044
1045
|
if value.startswith("-"):
|
1045
1046
|
if not (value := value[1:].strip()):
|
1046
|
-
return
|
1047
|
+
return fallback
|
1047
1048
|
value_negative = True
|
1048
1049
|
elif value.startswith("+"):
|
1049
1050
|
if not (value := value[1:].strip()):
|
1050
|
-
return
|
1051
|
+
return fallback
|
1051
1052
|
|
1052
|
-
if
|
1053
|
+
if allow_multiplier_suffix is True:
|
1053
1054
|
for suffix in _MULTIPLIER_SUFFIXES:
|
1054
1055
|
if value.endswith(suffix):
|
1055
1056
|
value_multiplier *= _MULTIPLIER_SUFFIXES[suffix]
|
1056
1057
|
if not (value := value[:-len(suffix)].strip()):
|
1057
|
-
return
|
1058
|
+
return fallback
|
1058
1059
|
break
|
1059
1060
|
|
1060
1061
|
if allow_float is True:
|
1061
|
-
if dot_index := value.
|
1062
|
+
if (dot_index := value.rfind(".")) >= 0:
|
1062
1063
|
if value_fraction := value[dot_index + 1:].strip():
|
1063
1064
|
try:
|
1065
|
+
# value_fraction = float(f"0.{value_fraction}")
|
1064
1066
|
value_fraction = float(f"0.{value_fraction}")
|
1065
1067
|
except Exception:
|
1066
|
-
return
|
1068
|
+
return fallback
|
1067
1069
|
value = value[:dot_index].strip()
|
1068
|
-
pass
|
1069
1070
|
|
1070
|
-
if allow_commas is True:
|
1071
|
+
if (allow_commas is True) and ("," in value):
|
1071
1072
|
if not re.fullmatch(r"(-?\d{1,3}(,\d{3})*)", value):
|
1072
|
-
return
|
1073
|
+
return fallback
|
1073
1074
|
value = value.replace(",", "")
|
1074
1075
|
|
1075
1076
|
if not value.isdigit():
|
1076
|
-
return
|
1077
|
+
return fallback
|
1077
1078
|
|
1078
|
-
result = int(value)
|
1079
|
+
result = int(value)
|
1079
1080
|
|
1080
1081
|
if value_fraction:
|
1081
1082
|
result += value_fraction
|
1082
1083
|
|
1084
|
+
result *= value_multiplier
|
1085
|
+
|
1083
1086
|
if value_negative:
|
1084
1087
|
result = -result
|
1085
1088
|
|
1089
|
+
if allow_float is True:
|
1090
|
+
if result == int(result):
|
1091
|
+
result = int(result)
|
1092
|
+
|
1086
1093
|
return result
|
1087
1094
|
|
1088
1095
|
|
dcicutils/structured_data.py
CHANGED
@@ -13,7 +13,7 @@ from dcicutils.data_readers import CsvReader, Excel, RowReader
|
|
13
13
|
from dcicutils.datetime_utils import normalize_date_string, normalize_datetime_string
|
14
14
|
from dcicutils.misc_utils import (create_dict, create_readonly_object, is_uuid, load_json_if,
|
15
15
|
merge_objects, remove_empty_properties, right_trim, split_string,
|
16
|
-
to_boolean, to_enum,
|
16
|
+
to_boolean, to_enum, to_integer, to_number, VirtualApp)
|
17
17
|
from dcicutils.portal_object_utils import PortalObject
|
18
18
|
from dcicutils.portal_utils import Portal as PortalBase
|
19
19
|
from dcicutils.submitr.progress_constants import PROGRESS_PARSE as PROGRESS
|
@@ -723,13 +723,23 @@ class Schema(SchemaBase):
|
|
723
723
|
return lambda value, src: map_enum(value, typeinfo.get("enum", []), src)
|
724
724
|
|
725
725
|
def _map_function_integer(self, typeinfo: dict) -> Callable:
|
726
|
-
|
727
|
-
|
726
|
+
allow_commas = typeinfo.get("allow_commas") is True
|
727
|
+
allow_multiplier_suffix = typeinfo.get("allow_multiplier_suffix") is True
|
728
|
+
def map_integer(value: str, src: Optional[str]) -> Any: # noqa
|
729
|
+
nonlocal allow_commas, allow_multiplier_suffix
|
730
|
+
return to_number(value, fallback=value, allow_float=False,
|
731
|
+
allow_commas=allow_commas,
|
732
|
+
allow_multiplier_suffix=allow_multiplier_suffix)
|
728
733
|
return map_integer
|
729
734
|
|
730
735
|
def _map_function_number(self, typeinfo: dict) -> Callable:
|
731
|
-
|
732
|
-
|
736
|
+
allow_commas = typeinfo.get("allow_commas") is True
|
737
|
+
allow_multiplier_suffix = typeinfo.get("allow_multiplier_suffix") is True
|
738
|
+
def map_number(value: str, src: Optional[str]) -> Any: # noqa
|
739
|
+
nonlocal allow_commas, allow_multiplier_suffix
|
740
|
+
return to_number(value, fallback=value, allow_float=True,
|
741
|
+
allow_commas=allow_commas,
|
742
|
+
allow_multiplier_suffix=allow_multiplier_suffix)
|
733
743
|
return map_number
|
734
744
|
|
735
745
|
def _map_function_string(self, typeinfo: dict) -> Callable:
|
@@ -45,7 +45,7 @@ dcicutils/license_policies/park-lab-gpl-pipeline.jsonc,sha256=vLZkwm3Js-kjV44nug
|
|
45
45
|
dcicutils/license_policies/park-lab-pipeline.jsonc,sha256=9qlY0ASy3iUMQlr3gorVcXrSfRHnVGbLhkS427UaRy4,283
|
46
46
|
dcicutils/license_utils.py,sha256=2Yxnh1T1iuMe6wluwbvpFO_zYSGPxB4-STAMc-vz-YM,47202
|
47
47
|
dcicutils/log_utils.py,sha256=7pWMc6vyrorUZQf-V-M3YC6zrPgNhuV_fzm9xqTPph0,10883
|
48
|
-
dcicutils/misc_utils.py,sha256=
|
48
|
+
dcicutils/misc_utils.py,sha256=GwabwKfZvv8tXcEtPBwzNHPbOfzgAbRswTkYDoW6pFE,112984
|
49
49
|
dcicutils/obfuscation_utils.py,sha256=fo2jOmDRC6xWpYX49u80bVNisqRRoPskFNX3ymFAmjw,5963
|
50
50
|
dcicutils/opensearch_utils.py,sha256=V2exmFYW8Xl2_pGFixF4I2Cc549Opwe4PhFi5twC0M8,1017
|
51
51
|
dcicutils/portal_object_utils.py,sha256=Az3n1aL-PQkN5gOFE6ZqC2XkYsqiwKlq7-tZggs1QN4,11062
|
@@ -66,7 +66,7 @@ dcicutils/secrets_utils.py,sha256=8dppXAsiHhJzI6NmOcvJV5ldvKkQZzh3Fl-cb8Wm7MI,19
|
|
66
66
|
dcicutils/sheet_utils.py,sha256=VlmzteONW5VF_Q4vo0yA5vesz1ViUah1MZ_yA1rwZ0M,33629
|
67
67
|
dcicutils/snapshot_utils.py,sha256=YDeI3vD-MhAtHwKDzfEm2q-n3l-da2yRpRR3xp0Ah1M,23021
|
68
68
|
dcicutils/ssl_certificate_utils.py,sha256=F0ifz_wnRRN9dfrfsz7aCp4UDLgHEY8LaK7PjnNvrAQ,9707
|
69
|
-
dcicutils/structured_data.py,sha256=
|
69
|
+
dcicutils/structured_data.py,sha256=OfGV92SxUosCuh3hwvRJGwreGx1Q43q73mryIZurrxk,66157
|
70
70
|
dcicutils/submitr/progress_constants.py,sha256=5bxyX77ql8qEJearfHEvsvXl7D0GuUODW0T65mbRmnE,2895
|
71
71
|
dcicutils/submitr/ref_lookup_strategy.py,sha256=VJN-Oo0LLna6Vo2cu47eC-eU-yUC9NFlQP29xajejVU,4741
|
72
72
|
dcicutils/task_utils.py,sha256=MF8ujmTD6-O2AC2gRGPHyGdUrVKgtr8epT5XU8WtNjk,8082
|
@@ -75,8 +75,8 @@ dcicutils/trace_utils.py,sha256=g8kwV4ebEy5kXW6oOrEAUsurBcCROvwtZqz9fczsGRE,1769
|
|
75
75
|
dcicutils/validation_utils.py,sha256=cMZIU2cY98FYtzK52z5WUYck7urH6JcqOuz9jkXpqzg,14797
|
76
76
|
dcicutils/variant_utils.py,sha256=2H9azNx3xAj-MySg-uZ2SFqbWs4kZvf61JnK6b-h4Qw,4343
|
77
77
|
dcicutils/zip_utils.py,sha256=_Y9EmL3D2dUZhxucxHvrtmmlbZmK4FpSsHEb7rGSJLU,3265
|
78
|
-
dcicutils-8.13.3.
|
79
|
-
dcicutils-8.13.3.
|
80
|
-
dcicutils-8.13.3.
|
81
|
-
dcicutils-8.13.3.
|
82
|
-
dcicutils-8.13.3.
|
78
|
+
dcicutils-8.13.3.1b23.dist-info/LICENSE.txt,sha256=qnwSmfnEWMl5l78VPDEzAmEbLVrRqQvfUQiHT0ehrOo,1102
|
79
|
+
dcicutils-8.13.3.1b23.dist-info/METADATA,sha256=ENxCidpL5wyavgS1kKnIj09sMPK42qj0Q9sl1s8WAoU,3440
|
80
|
+
dcicutils-8.13.3.1b23.dist-info/WHEEL,sha256=7Z8_27uaHI_UZAc4Uox4PpBhQ9Y5_modZXWMxtUi4NU,88
|
81
|
+
dcicutils-8.13.3.1b23.dist-info/entry_points.txt,sha256=W6kEWdUJk9tQ4myAgpehPdebcwvCAZ7UgB-wyPgDUMg,335
|
82
|
+
dcicutils-8.13.3.1b23.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|