dycw-utilities 0.175.22__py3-none-any.whl → 0.175.24__py3-none-any.whl

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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: dycw-utilities
3
- Version: 0.175.22
3
+ Version: 0.175.24
4
4
  Summary: Miscellaneous Python utilities
5
5
  Author: Derek Wan
6
6
  Author-email: Derek Wan <d.wan@icloud.com>
@@ -1,4 +1,4 @@
1
- utilities/__init__.py,sha256=sU42IQNdRzdYqP75DUwM7K3Ehuq6BiyoV70DPstqNi4,61
1
+ utilities/__init__.py,sha256=5B4185Je5N1a7pdW809Ek1j0ijDB3zrA5o4fo5XSiuw,61
2
2
  utilities/altair.py,sha256=TLfRFbG9HwG7SLXoJ-v0r-t49ZaGgTQZD82cpjVi4vs,9085
3
3
  utilities/asyncio.py,sha256=aJySVxBY0gqsIYnoNmH7-1r8djKuf4vSsU69VCD08t8,16772
4
4
  utilities/atomicwrites.py,sha256=tPo6r-Rypd9u99u66B9z86YBPpnLrlHtwox_8Z7T34Y,5790
@@ -80,7 +80,7 @@ utilities/sqlalchemy.py,sha256=HQYpd7LFxdTF5WYVWYtCJeEBI71EJm7ytvCGyAH9B-U,37163
80
80
  utilities/sqlalchemy_polars.py,sha256=JCGhB37raSR7fqeWV5dTsciRTMVzIdVT9YSqKT0piT0,13370
81
81
  utilities/statsmodels.py,sha256=koyiBHvpMcSiBfh99wFUfSggLNx7cuAw3rwyfAhoKpQ,3410
82
82
  utilities/string.py,sha256=shmBK87zZwzGyixuNuXCiUbqzfeZ9xlrFwz6JTaRvDk,582
83
- utilities/subprocess.py,sha256=p8bzzSc9m-E-Vz8p3mulKi2Jo60Mp0qoiou0Kjd5ZjI,45823
83
+ utilities/subprocess.py,sha256=YmFlOyuwsEK_OHH47vbG603_2BgY_pB18IrmCUjA-BE,45980
84
84
  utilities/tempfile.py,sha256=a3_M1QyxGZql_VcGkBOQBeWbbkItjgkfIpVyzU1UAic,3843
85
85
  utilities/testbook.py,sha256=j1KmaVbrX9VrbeMgtPh5gk55myAsn3dyRUn7jGbPbRk,1294
86
86
  utilities/text.py,sha256=7SvwcSR2l_5cOrm1samGnR4C-ZI6qyFLHLzSpO1zeHQ,13958
@@ -97,7 +97,7 @@ utilities/warnings.py,sha256=un1LvHv70PU-LLv8RxPVmugTzDJkkGXRMZTE2-fTQHw,1771
97
97
  utilities/whenever.py,sha256=F4ek0-OBWxHYrZdmoZt76N2RnNyKY5KrEHt7rqO4AQE,60183
98
98
  utilities/zipfile.py,sha256=24lQc9ATcJxHXBPc_tBDiJk48pWyRrlxO2fIsFxU0A8,699
99
99
  utilities/zoneinfo.py,sha256=tdIScrTB2-B-LH0ukb1HUXKooLknOfJNwHk10MuMYvA,3619
100
- dycw_utilities-0.175.22.dist-info/WHEEL,sha256=RRVLqVugUmFOqBedBFAmA4bsgFcROUBiSUKlERi0Hcg,79
101
- dycw_utilities-0.175.22.dist-info/entry_points.txt,sha256=cOGtKeJI0KXLSV7MJ8Dhc2G8jPgDcBDm53MVNJU4ycI,136
102
- dycw_utilities-0.175.22.dist-info/METADATA,sha256=gFB3Hnr93Qj949yWxcBj1ULGuI6tV_4eM1-L5ptCwm8,1443
103
- dycw_utilities-0.175.22.dist-info/RECORD,,
100
+ dycw_utilities-0.175.24.dist-info/WHEEL,sha256=RRVLqVugUmFOqBedBFAmA4bsgFcROUBiSUKlERi0Hcg,79
101
+ dycw_utilities-0.175.24.dist-info/entry_points.txt,sha256=cOGtKeJI0KXLSV7MJ8Dhc2G8jPgDcBDm53MVNJU4ycI,136
102
+ dycw_utilities-0.175.24.dist-info/METADATA,sha256=TsMRFyemwh01F5d7kNpuH0fW59FQnbp7yHMGQcPoSD0,1443
103
+ dycw_utilities-0.175.24.dist-info/RECORD,,
utilities/__init__.py CHANGED
@@ -1,3 +1,3 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.175.22"
3
+ __version__ = "0.175.24"
utilities/subprocess.py CHANGED
@@ -7,7 +7,7 @@ from dataclasses import dataclass
7
7
  from io import StringIO
8
8
  from itertools import repeat
9
9
  from pathlib import Path
10
- from re import search
10
+ from re import MULTILINE, search
11
11
  from shlex import join
12
12
  from shutil import copyfile, copytree, move, rmtree
13
13
  from string import Template
@@ -1169,8 +1169,9 @@ def _ssh_retry_skip(return_code: int, stdout: str, stderr: str, /) -> bool:
1169
1169
 
1170
1170
  def _ssh_is_strict_checking_error(text: str, /) -> bool:
1171
1171
  match = search(
1172
- "No ED25519 host key is known for .* and you have requested strict checking",
1172
+ "(Host key for .* has changed|No ED25519 host key is known for .*) and you have requested strict checking",
1173
1173
  text,
1174
+ flags=MULTILINE,
1174
1175
  )
1175
1176
  return match is not None
1176
1177
 
@@ -1246,13 +1247,19 @@ def ssh_await(
1246
1247
 
1247
1248
 
1248
1249
  def ssh_keyscan(
1249
- hostname: str, /, *, path: PathLike = KNOWN_HOSTS, port: int | None = None
1250
+ hostname: str,
1251
+ /,
1252
+ *,
1253
+ path: PathLike = KNOWN_HOSTS,
1254
+ retry: Retry | None = None,
1255
+ port: int | None = None,
1250
1256
  ) -> None:
1251
1257
  """Add a known host."""
1252
- ssh_keygen_remove(hostname, path=path) # skipif-ci
1253
- mkdir(path, parent=True) # skipif-ci
1254
- with Path(path).open(mode="a") as fh: # skipif-ci
1255
- _ = fh.write(run(*ssh_keyscan_cmd(hostname, port=port), return_=True))
1258
+ ssh_keygen_remove(hostname, path=path, retry=retry) # skipif-ci
1259
+ result = run( # skipif-ci
1260
+ *ssh_keyscan_cmd(hostname, port=port), return_=True, retry=retry
1261
+ )
1262
+ tee(path, result, append=True) # skipif-ci
1256
1263
 
1257
1264
 
1258
1265
  def ssh_keyscan_cmd(hostname: str, /, *, port: int | None = None) -> list[str]:
@@ -1266,11 +1273,13 @@ def ssh_keyscan_cmd(hostname: str, /, *, port: int | None = None) -> list[str]:
1266
1273
  ##
1267
1274
 
1268
1275
 
1269
- def ssh_keygen_remove(hostname: str, /, *, path: PathLike = KNOWN_HOSTS) -> None:
1276
+ def ssh_keygen_remove(
1277
+ hostname: str, /, *, path: PathLike = KNOWN_HOSTS, retry: Retry | None = None
1278
+ ) -> None:
1270
1279
  """Remove a known host."""
1271
1280
  path = Path(path)
1272
1281
  if path.exists():
1273
- run(*ssh_keygen_remove_cmd(hostname, path=path))
1282
+ run(*ssh_keygen_remove_cmd(hostname, path=path), retry=retry)
1274
1283
 
1275
1284
 
1276
1285
  def ssh_keygen_remove_cmd(