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