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 CHANGED
@@ -1021,21 +1021,22 @@ _MULTIPLIER_SUFFIXES = {
1021
1021
 
1022
1022
  def to_number(value: str,
1023
1023
  allow_commas: bool = False,
1024
- allow_suffix: bool = False,
1025
- allow_float: bool = False) -> Optional[Union[int, float]]:
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 allow_suffix is True (default: False) allow any of K, Kb, KB; or M, Mb, MB; or
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 rather than int.
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 None
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 None
1047
+ return fallback
1047
1048
  value_negative = True
1048
1049
  elif value.startswith("+"):
1049
1050
  if not (value := value[1:].strip()):
1050
- return None
1051
+ return fallback
1051
1052
 
1052
- if allow_suffix is True:
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 None
1058
+ return fallback
1058
1059
  break
1059
1060
 
1060
1061
  if allow_float is True:
1061
- if dot_index := value.rindex("."):
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 None
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 None
1073
+ return fallback
1073
1074
  value = value.replace(",", "")
1074
1075
 
1075
1076
  if not value.isdigit():
1076
- return None
1077
+ return fallback
1077
1078
 
1078
- result = int(value) * value_multiplier
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
 
@@ -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, to_float, to_integer, VirtualApp)
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
- def map_integer(value: str, src: Optional[str]) -> Any:
727
- return to_integer(value, value, strict=True)
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
- def map_number(value: str, src: Optional[str]) -> Any:
732
- return to_float(value, value)
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:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dcicutils
3
- Version: 8.13.3.1b20
3
+ Version: 8.13.3.1b23
4
4
  Summary: Utility package for interacting with the 4DN Data Portal and other 4DN resources
5
5
  Home-page: https://github.com/4dn-dcic/utils
6
6
  License: MIT
@@ -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=m-b32XaIYEfAr6UAOZRmXgLOdWlXp3AXH_OIkM8NKGQ,112656
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=QXPxKM_-HqWw_dXvRZwEAWH678knbW3GvIC0KXmbk54,65428
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.1b20.dist-info/LICENSE.txt,sha256=qnwSmfnEWMl5l78VPDEzAmEbLVrRqQvfUQiHT0ehrOo,1102
79
- dcicutils-8.13.3.1b20.dist-info/METADATA,sha256=jRWl85yumNIth2luRt_LhcOO6ohInbQ3TTHWrL4W-jQ,3440
80
- dcicutils-8.13.3.1b20.dist-info/WHEEL,sha256=7Z8_27uaHI_UZAc4Uox4PpBhQ9Y5_modZXWMxtUi4NU,88
81
- dcicutils-8.13.3.1b20.dist-info/entry_points.txt,sha256=W6kEWdUJk9tQ4myAgpehPdebcwvCAZ7UgB-wyPgDUMg,335
82
- dcicutils-8.13.3.1b20.dist-info/RECORD,,
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,,