dcicutils 8.13.3.1b20__tar.gz → 8.13.3.1b22__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/PKG-INFO +1 -1
  2. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/misc_utils.py +19 -19
  3. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/structured_data.py +15 -5
  4. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/pyproject.toml +1 -1
  5. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/LICENSE.txt +0 -0
  6. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/README.rst +0 -0
  7. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/__init__.py +0 -0
  8. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/base.py +0 -0
  9. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/beanstalk_utils.py +0 -0
  10. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/bundle_utils.py +0 -0
  11. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/captured_output.py +0 -0
  12. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/cloudformation_utils.py +0 -0
  13. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/codebuild_utils.py +0 -0
  14. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/command_utils.py +0 -0
  15. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/common.py +0 -0
  16. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/contribution_scripts.py +0 -0
  17. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/contribution_utils.py +0 -0
  18. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/creds_utils.py +0 -0
  19. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/data_readers.py +0 -0
  20. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/data_utils.py +0 -0
  21. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/datetime_utils.py +0 -0
  22. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/deployment_utils.py +0 -0
  23. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/diff_utils.py +0 -0
  24. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/docker_utils.py +0 -0
  25. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/ecr_scripts.py +0 -0
  26. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/ecr_utils.py +0 -0
  27. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/ecs_utils.py +0 -0
  28. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/env_base.py +0 -0
  29. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/env_manager.py +0 -0
  30. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/env_scripts.py +0 -0
  31. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/env_utils.py +0 -0
  32. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/env_utils_legacy.py +0 -0
  33. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/es_utils.py +0 -0
  34. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/exceptions.py +0 -0
  35. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/ff_mocks.py +0 -0
  36. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/ff_utils.py +0 -0
  37. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/file_utils.py +0 -0
  38. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/function_cache_decorator.py +0 -0
  39. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/glacier_utils.py +0 -0
  40. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/hack_for_elasticsearch_numpy_usage.py +0 -0
  41. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/http_utils.py +0 -0
  42. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/jh_utils.py +0 -0
  43. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/kibana/dashboards.json +0 -0
  44. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/kibana/readme.md +0 -0
  45. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/lang_utils.py +0 -0
  46. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/license_policies/c4-infrastructure.jsonc +0 -0
  47. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/license_policies/c4-python-infrastructure.jsonc +0 -0
  48. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/license_policies/park-lab-common-server.jsonc +0 -0
  49. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/license_policies/park-lab-common.jsonc +0 -0
  50. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/license_policies/park-lab-gpl-pipeline.jsonc +0 -0
  51. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/license_policies/park-lab-pipeline.jsonc +0 -0
  52. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/license_utils.py +0 -0
  53. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/log_utils.py +0 -0
  54. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/obfuscation_utils.py +0 -0
  55. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/opensearch_utils.py +0 -0
  56. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/portal_object_utils.py +0 -0
  57. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/portal_utils.py +0 -0
  58. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/progress_bar.py +0 -0
  59. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/project_utils.py +0 -0
  60. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/qa_checkers.py +0 -0
  61. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/qa_utils.py +0 -0
  62. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/redis_tools.py +0 -0
  63. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/redis_utils.py +0 -0
  64. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/s3_utils.py +0 -0
  65. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/schema_utils.py +0 -0
  66. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/scripts/publish_to_pypi.py +0 -0
  67. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/scripts/run_license_checker.py +0 -0
  68. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/scripts/update_portal_object.py +0 -0
  69. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/scripts/view_portal_object.py +0 -0
  70. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/secrets_utils.py +0 -0
  71. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/sheet_utils.py +0 -0
  72. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/snapshot_utils.py +0 -0
  73. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/ssl_certificate_utils.py +0 -0
  74. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/submitr/progress_constants.py +0 -0
  75. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/submitr/ref_lookup_strategy.py +0 -0
  76. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/task_utils.py +0 -0
  77. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/tmpfile_utils.py +0 -0
  78. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/trace_utils.py +0 -0
  79. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/validation_utils.py +0 -0
  80. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/variant_utils.py +0 -0
  81. {dcicutils-8.13.3.1b20 → dcicutils-8.13.3.1b22}/dcicutils/zip_utils.py +0 -0
@@ -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.1b22
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
@@ -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
+ as_float: bool = False,
1026
+ fallback: Optional[Union[int, float]] = None) -> Optional[Union[int, float]]:
1026
1027
 
1027
1028
  """
1028
- Converts the give string value to an int, or possibly float if allow_float is True.
1029
+ Converts the give string value to an int, or float if as_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;
1032
- one billion; or one trillion; respectively. If allow_float is True (default: False)
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;
1033
+ one billion; or one trillion; respectively. If as_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
1035
  in which case the returned value will be of type float rather than 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,37 +1044,36 @@ 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
- if allow_float is True:
1061
- if dot_index := value.rindex("."):
1061
+ if as_float is True:
1062
+ if (dot_index := value.rfind(".")) >= 0:
1062
1063
  if value_fraction := value[dot_index + 1:].strip():
1063
1064
  try:
1064
1065
  value_fraction = float(f"0.{value_fraction}")
1065
1066
  except Exception:
1066
- return None
1067
+ return fallback
1067
1068
  value = value[:dot_index].strip()
1068
- pass
1069
1069
 
1070
- if allow_commas is True:
1070
+ if (allow_commas is True) and ("," in value):
1071
1071
  if not re.fullmatch(r"(-?\d{1,3}(,\d{3})*)", value):
1072
- return None
1072
+ return fallback
1073
1073
  value = value.replace(",", "")
1074
1074
 
1075
1075
  if not value.isdigit():
1076
- return None
1076
+ return fallback
1077
1077
 
1078
1078
  result = int(value) * value_multiplier
1079
1079
 
@@ -1083,7 +1083,7 @@ def to_number(value: str,
1083
1083
  if value_negative:
1084
1084
  result = -result
1085
1085
 
1086
- return result
1086
+ return float(result) if as_float is True else result
1087
1087
 
1088
1088
 
1089
1089
  def to_float(value: str, fallback: Optional[Any] = None) -> Optional[Any]:
@@ -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, as_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, as_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
  [tool.poetry]
2
2
  name = "dcicutils"
3
- version = "8.13.3.1b20" # TODO: To become 8.14.0
3
+ version = "8.13.3.1b22" # TODO: To become 8.14.0
4
4
  description = "Utility package for interacting with the 4DN Data Portal and other 4DN resources"
5
5
  authors = ["4DN-DCIC Team <support@4dnucleome.org>"]
6
6
  license = "MIT"