dycw-utilities 0.174.17__tar.gz → 0.174.18__tar.gz

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.
Files changed (103) hide show
  1. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/PKG-INFO +1 -1
  2. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/pyproject.toml +2 -2
  3. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/__init__.py +1 -1
  4. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/docker.py +1 -0
  5. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/subprocess.py +38 -0
  6. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/README.md +0 -0
  7. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/aeventkit.py +0 -0
  8. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/altair.py +0 -0
  9. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/asyncio.py +0 -0
  10. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/atomicwrites.py +0 -0
  11. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/atools.py +0 -0
  12. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/cachetools.py +0 -0
  13. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/click.py +0 -0
  14. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/concurrent.py +0 -0
  15. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/contextlib.py +0 -0
  16. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/contextvars.py +0 -0
  17. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/cryptography.py +0 -0
  18. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/cvxpy.py +0 -0
  19. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/dataclasses.py +0 -0
  20. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/enum.py +0 -0
  21. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/errors.py +0 -0
  22. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/fastapi.py +0 -0
  23. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/fpdf2.py +0 -0
  24. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/functions.py +0 -0
  25. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/functools.py +0 -0
  26. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/getpass.py +0 -0
  27. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/git.py +0 -0
  28. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/grp.py +0 -0
  29. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/gzip.py +0 -0
  30. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/hashlib.py +0 -0
  31. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/http.py +0 -0
  32. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/hypothesis.py +0 -0
  33. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/importlib.py +0 -0
  34. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/inflect.py +0 -0
  35. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/ipython.py +0 -0
  36. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/iterables.py +0 -0
  37. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/jinja2.py +0 -0
  38. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/json.py +0 -0
  39. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/jupyter.py +0 -0
  40. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/libcst.py +0 -0
  41. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/lightweight_charts.py +0 -0
  42. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/logging.py +0 -0
  43. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/math.py +0 -0
  44. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/memory_profiler.py +0 -0
  45. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/modules.py +0 -0
  46. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/more_itertools.py +0 -0
  47. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/numpy.py +0 -0
  48. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/operator.py +0 -0
  49. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/optuna.py +0 -0
  50. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/orjson.py +0 -0
  51. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/os.py +0 -0
  52. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/parse.py +0 -0
  53. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/pathlib.py +0 -0
  54. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/permissions.py +0 -0
  55. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/pickle.py +0 -0
  56. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/platform.py +0 -0
  57. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/polars.py +0 -0
  58. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/polars_ols.py +0 -0
  59. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/postgres.py +0 -0
  60. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/pottery.py +0 -0
  61. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/pqdm.py +0 -0
  62. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/psutil.py +0 -0
  63. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/pwd.py +0 -0
  64. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/py.typed +0 -0
  65. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/pydantic.py +0 -0
  66. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/pydantic_settings.py +0 -0
  67. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/pydantic_settings_sops.py +0 -0
  68. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/pyinstrument.py +0 -0
  69. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/pytest.py +0 -0
  70. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/pytest_plugins/__init__.py +0 -0
  71. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/pytest_plugins/pytest_randomly.py +0 -0
  72. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/pytest_plugins/pytest_regressions.py +0 -0
  73. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/pytest_regressions.py +0 -0
  74. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/random.py +0 -0
  75. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/re.py +0 -0
  76. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/redis.py +0 -0
  77. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/reprlib.py +0 -0
  78. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/scipy.py +0 -0
  79. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/sentinel.py +0 -0
  80. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/shelve.py +0 -0
  81. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/shutil.py +0 -0
  82. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/slack_sdk.py +0 -0
  83. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/socket.py +0 -0
  84. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/sqlalchemy.py +0 -0
  85. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/sqlalchemy_polars.py +0 -0
  86. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/statsmodels.py +0 -0
  87. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/string.py +0 -0
  88. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/tempfile.py +0 -0
  89. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/testbook.py +0 -0
  90. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/text.py +0 -0
  91. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/threading.py +0 -0
  92. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/timer.py +0 -0
  93. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/traceback.py +0 -0
  94. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/types.py +0 -0
  95. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/typing.py +0 -0
  96. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/tzdata.py +0 -0
  97. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/tzlocal.py +0 -0
  98. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/uuid.py +0 -0
  99. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/version.py +0 -0
  100. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/warnings.py +0 -0
  101. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/whenever.py +0 -0
  102. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/zipfile.py +0 -0
  103. {dycw_utilities-0.174.17 → dycw_utilities-0.174.18}/src/utilities/zoneinfo.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: dycw-utilities
3
- Version: 0.174.17
3
+ Version: 0.174.18
4
4
  Author: Derek Wan
5
5
  Author-email: Derek Wan <d.wan@icloud.com>
6
6
  Requires-Dist: atomicwrites>=1.4.1,<1.5
@@ -101,7 +101,7 @@
101
101
  name = "dycw-utilities"
102
102
  readme = "README.md"
103
103
  requires-python = ">= 3.12"
104
- version = "0.174.17"
104
+ version = "0.174.18"
105
105
 
106
106
  [project.entry-points.pytest11]
107
107
  pytest-randomly = "utilities.pytest_plugins.pytest_randomly"
@@ -135,7 +135,7 @@
135
135
  # bump-my-version
136
136
  [tool.bumpversion]
137
137
  allow_dirty = true
138
- current_version = "0.174.17"
138
+ current_version = "0.174.18"
139
139
 
140
140
  [[tool.bumpversion.files]]
141
141
  filename = "src/utilities/__init__.py"
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.174.17"
3
+ __version__ = "0.174.18"
@@ -269,6 +269,7 @@ def yield_docker_temp_dir(
269
269
  logger: LoggerLike | None = None,
270
270
  keep: bool = False,
271
271
  ) -> Iterator[Path]:
272
+ """Yield a temporary directory in a Docker container."""
272
273
  path = Path( # skipif-ci
273
274
  docker_exec(
274
275
  container,
@@ -221,6 +221,16 @@ def expand_path(
221
221
  ##
222
222
 
223
223
 
224
+ def git_clone(
225
+ url: str, path: PathLike, /, *, sudo: bool = False, branch: str | None = None
226
+ ) -> None:
227
+ """Clone a repository."""
228
+ rm(path, sudo=sudo)
229
+ run(*maybe_sudo_cmd(*git_clone_cmd(url, path), sudo=sudo))
230
+ if branch is not None:
231
+ run(*maybe_sudo_cmd(*git_hard_reset_cmd(branch=branch), sudo=sudo), cwd=path)
232
+
233
+
224
234
  def git_clone_cmd(url: str, path: PathLike, /) -> list[str]:
225
235
  """Command to use 'git clone' to clone a repository."""
226
236
  return ["git", "clone", "--recurse-submodules", url, str(path)]
@@ -1089,14 +1099,26 @@ def tee_cmd(path: PathLike, /, *, append: bool = False) -> list[str]:
1089
1099
  ##
1090
1100
 
1091
1101
 
1102
+ def touch(path: PathLike, /, *, sudo: bool = False) -> None:
1103
+ """Change file access and modification times."""
1104
+ run(*maybe_sudo_cmd(*touch_cmd(path), sudo=sudo))
1105
+
1106
+
1092
1107
  def touch_cmd(path: PathLike, /) -> list[str]:
1108
+ """Command to use 'touch' to change file access and modification times."""
1093
1109
  return ["touch", str(path)]
1094
1110
 
1095
1111
 
1096
1112
  ##
1097
1113
 
1098
1114
 
1115
+ def uv_run(module: str, /, *args: str) -> None:
1116
+ """Run a command or script."""
1117
+ run(*uv_run_cmd(module, *args)) # pragma: no cover
1118
+
1119
+
1099
1120
  def uv_run_cmd(module: str, /, *args: str) -> list[str]:
1121
+ """Command to use 'uv' to run a command or script."""
1100
1122
  return [
1101
1123
  "uv",
1102
1124
  "run",
@@ -1114,6 +1136,17 @@ def uv_run_cmd(module: str, /, *args: str) -> list[str]:
1114
1136
  ##
1115
1137
 
1116
1138
 
1139
+ @contextmanager
1140
+ def yield_git_repo(url: str, /, *, branch: str | None = None) -> Iterator[Path]:
1141
+ """Yield a temporary git repository."""
1142
+ with TemporaryDirectory() as temp_dir:
1143
+ git_clone(url, temp_dir, branch=branch)
1144
+ yield temp_dir
1145
+
1146
+
1147
+ ##
1148
+
1149
+
1117
1150
  @contextmanager
1118
1151
  def yield_ssh_temp_dir(
1119
1152
  user: str,
@@ -1124,6 +1157,7 @@ def yield_ssh_temp_dir(
1124
1157
  logger: LoggerLike | None = None,
1125
1158
  keep: bool = False,
1126
1159
  ) -> Iterator[Path]:
1160
+ """Yield a temporary directory on a remote machine."""
1127
1161
  path = Path( # skipif-ci
1128
1162
  ssh(user, hostname, *MKTEMP_DIR_CMD, return_=True, retry=retry, logger=logger)
1129
1163
  )
@@ -1160,6 +1194,7 @@ __all__ = [
1160
1194
  "cp_cmd",
1161
1195
  "echo_cmd",
1162
1196
  "expand_path",
1197
+ "git_clone",
1163
1198
  "git_clone_cmd",
1164
1199
  "git_hard_reset_cmd",
1165
1200
  "maybe_parent",
@@ -1183,7 +1218,10 @@ __all__ = [
1183
1218
  "symlink",
1184
1219
  "symlink_cmd",
1185
1220
  "tee_cmd",
1221
+ "touch",
1186
1222
  "touch_cmd",
1223
+ "uv_run",
1187
1224
  "uv_run_cmd",
1225
+ "yield_git_repo",
1188
1226
  "yield_ssh_temp_dir",
1189
1227
  ]