dcicutils 8.13.3.1b20__py3-none-any.whl → 8.13.3.1b23__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|