dcicutils 8.13.3.1b13__tar.gz → 8.13.3.1b16__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.1b13 → dcicutils-8.13.3.1b16}/PKG-INFO +1 -1
  2. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/misc_utils.py +91 -2
  3. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/pyproject.toml +1 -1
  4. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/LICENSE.txt +0 -0
  5. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/README.rst +0 -0
  6. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/__init__.py +0 -0
  7. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/base.py +0 -0
  8. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/beanstalk_utils.py +0 -0
  9. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/bundle_utils.py +0 -0
  10. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/captured_output.py +0 -0
  11. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/cloudformation_utils.py +0 -0
  12. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/codebuild_utils.py +0 -0
  13. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/command_utils.py +0 -0
  14. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/common.py +0 -0
  15. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/contribution_scripts.py +0 -0
  16. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/contribution_utils.py +0 -0
  17. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/creds_utils.py +0 -0
  18. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/data_readers.py +0 -0
  19. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/data_utils.py +0 -0
  20. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/datetime_utils.py +0 -0
  21. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/deployment_utils.py +0 -0
  22. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/diff_utils.py +0 -0
  23. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/docker_utils.py +0 -0
  24. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/ecr_scripts.py +0 -0
  25. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/ecr_utils.py +0 -0
  26. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/ecs_utils.py +0 -0
  27. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/env_base.py +0 -0
  28. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/env_manager.py +0 -0
  29. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/env_scripts.py +0 -0
  30. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/env_utils.py +0 -0
  31. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/env_utils_legacy.py +0 -0
  32. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/es_utils.py +0 -0
  33. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/exceptions.py +0 -0
  34. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/ff_mocks.py +0 -0
  35. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/ff_utils.py +0 -0
  36. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/file_utils.py +0 -0
  37. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/function_cache_decorator.py +0 -0
  38. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/glacier_utils.py +0 -0
  39. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/hack_for_elasticsearch_numpy_usage.py +0 -0
  40. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/http_utils.py +0 -0
  41. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/jh_utils.py +0 -0
  42. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/kibana/dashboards.json +0 -0
  43. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/kibana/readme.md +0 -0
  44. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/lang_utils.py +0 -0
  45. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/license_policies/c4-infrastructure.jsonc +0 -0
  46. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/license_policies/c4-python-infrastructure.jsonc +0 -0
  47. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/license_policies/park-lab-common-server.jsonc +0 -0
  48. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/license_policies/park-lab-common.jsonc +0 -0
  49. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/license_policies/park-lab-gpl-pipeline.jsonc +0 -0
  50. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/license_policies/park-lab-pipeline.jsonc +0 -0
  51. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/license_utils.py +0 -0
  52. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/log_utils.py +0 -0
  53. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/obfuscation_utils.py +0 -0
  54. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/opensearch_utils.py +0 -0
  55. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/portal_object_utils.py +0 -0
  56. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/portal_utils.py +0 -0
  57. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/progress_bar.py +0 -0
  58. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/project_utils.py +0 -0
  59. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/qa_checkers.py +0 -0
  60. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/qa_utils.py +0 -0
  61. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/redis_tools.py +0 -0
  62. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/redis_utils.py +0 -0
  63. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/s3_utils.py +0 -0
  64. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/schema_utils.py +0 -0
  65. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/scripts/publish_to_pypi.py +0 -0
  66. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/scripts/run_license_checker.py +0 -0
  67. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/scripts/update_portal_object.py +0 -0
  68. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/scripts/view_portal_object.py +0 -0
  69. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/secrets_utils.py +0 -0
  70. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/sheet_utils.py +0 -0
  71. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/snapshot_utils.py +0 -0
  72. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/ssl_certificate_utils.py +0 -0
  73. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/structured_data.py +0 -0
  74. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/submitr/progress_constants.py +0 -0
  75. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/submitr/ref_lookup_strategy.py +0 -0
  76. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/task_utils.py +0 -0
  77. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/tmpfile_utils.py +0 -0
  78. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/trace_utils.py +0 -0
  79. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/validation_utils.py +0 -0
  80. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/dcicutils/variant_utils.py +0 -0
  81. {dcicutils-8.13.3.1b13 → dcicutils-8.13.3.1b16}/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.1b13
3
+ Version: 8.13.3.1b16
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
@@ -3,6 +3,7 @@ This file contains functions that might be generally useful.
3
3
  """
4
4
 
5
5
  from collections import namedtuple
6
+ from collections.abc import Iterable
6
7
  import appdirs
7
8
  from copy import deepcopy
8
9
  import concurrent.futures
@@ -997,6 +998,94 @@ def to_integer(value: str, fallback: Optional[Any] = None, strict: bool = False)
997
998
  return fallback
998
999
 
999
1000
 
1001
+ _MULTIPLIER_K = 1000
1002
+ _MULTIPLIER_M = 1000 * _MULTIPLIER_K
1003
+ _MULTIPLIER_G = 1000 * _MULTIPLIER_M
1004
+ _MULTIPLIER_T = 1000 * _MULTIPLIER_G
1005
+
1006
+ _MULTIPLIER_SUFFIXES = {
1007
+ "K": _MULTIPLIER_K,
1008
+ "Kb": _MULTIPLIER_K,
1009
+ "KB": _MULTIPLIER_K,
1010
+ "M": _MULTIPLIER_M,
1011
+ "Mb": _MULTIPLIER_M,
1012
+ "MB": _MULTIPLIER_M,
1013
+ "G": _MULTIPLIER_G,
1014
+ "Gb": _MULTIPLIER_G,
1015
+ "GB": _MULTIPLIER_G,
1016
+ "T": _MULTIPLIER_T,
1017
+ "Tb": _MULTIPLIER_T,
1018
+ "TB": _MULTIPLIER_T
1019
+ }
1020
+
1021
+
1022
+ def to_number(value: str,
1023
+ allow_commas: bool = False,
1024
+ allow_suffix: bool = False,
1025
+ allow_float: bool = False) -> Optional[Union[int, float]]:
1026
+
1027
+ """
1028
+ Converts the give string value to an int, or possibly float if allow_float is True.
1029
+ 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)
1033
+ 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
+ If the string is not well formated then returns None.
1036
+ """
1037
+ if not (isinstance(value, str) and (value := value.strip())):
1038
+ return value if isinstance(value, (int, float)) else None
1039
+
1040
+ value_multiplier = 1
1041
+ value_negative = False
1042
+ value_fraction = None
1043
+
1044
+ if value.startswith("-"):
1045
+ if not (value := value[1:].strip()):
1046
+ return None
1047
+ value_negative = True
1048
+ elif value.startswith("+"):
1049
+ if not (value := value[1:].strip()):
1050
+ return None
1051
+
1052
+ if allow_suffix is True:
1053
+ for suffix in _MULTIPLIER_SUFFIXES:
1054
+ if value.endswith(suffix):
1055
+ value_multiplier *= _MULTIPLIER_SUFFIXES[suffix]
1056
+ if not (value := value[:-len(suffix)].strip()):
1057
+ return None
1058
+ break
1059
+
1060
+ if allow_float is True:
1061
+ if dot_index := value.rindex("."):
1062
+ if value_fraction := value[dot_index + 1:].strip():
1063
+ try:
1064
+ value_fraction = float(f"0.{value_fraction}")
1065
+ except Exception:
1066
+ return None
1067
+ value = value[:dot_index].strip()
1068
+ pass
1069
+
1070
+ if allow_commas is True:
1071
+ if not re.fullmatch(r"(-?\d{1,3}(,\d{3})*)", value):
1072
+ return None
1073
+ value = value.replace(",", "")
1074
+
1075
+ if not value.isdigit():
1076
+ return None
1077
+
1078
+ result = int(value) * value_multiplier
1079
+
1080
+ if value_fraction:
1081
+ result += value_fraction
1082
+
1083
+ if value_negative:
1084
+ result = -result
1085
+
1086
+ return result
1087
+
1088
+
1000
1089
  def to_float(value: str, fallback: Optional[Any] = None) -> Optional[Any]:
1001
1090
  try:
1002
1091
  return float(value)
@@ -2782,6 +2871,6 @@ def create_short_uuid(length: Optional[int] = None, upper: bool = False):
2782
2871
  return value
2783
2872
 
2784
2873
 
2785
- def run_concurrently(functions: List[Callable], nthreads: int = 4) -> None:
2874
+ def run_concurrently(functions: Iterable[Callable], nthreads: int = 4) -> None:
2786
2875
  with concurrent.futures.ThreadPoolExecutor(max_workers=nthreads) as executor:
2787
- [_ for _ in concurrent.futures.as_completed([executor.submit(f) for f in functions])]
2876
+ concurrent.futures.as_completed([executor.submit(f) for f in functions])
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "dcicutils"
3
- version = "8.13.3.1b13" # TODO: To become 8.13.4
3
+ version = "8.13.3.1b16" # 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"