thds.mops 3.9.20250722213952__py3-none-any.whl → 3.9.20250724233724__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.
Files changed (37) hide show
  1. thds/mops/impure/runner.py +1 -1
  2. thds/mops/k8s/__init__.py +3 -1
  3. thds/mops/k8s/{launch.py → _launch.py} +56 -57
  4. thds/mops/k8s/batching.py +198 -0
  5. thds/mops/k8s/config.py +1 -1
  6. thds/mops/k8s/counts.py +28 -0
  7. thds/mops/k8s/job_future.py +109 -0
  8. thds/mops/k8s/jobs.py +4 -0
  9. thds/mops/k8s/logging.py +37 -5
  10. thds/mops/k8s/uncertain_future.py +160 -0
  11. thds/mops/k8s/watch.py +120 -62
  12. thds/mops/pure/__init__.py +2 -1
  13. thds/mops/pure/_magic/sauce.py +11 -3
  14. thds/mops/pure/_magic/shims.py +2 -2
  15. thds/mops/pure/core/deferred_work.py +15 -12
  16. thds/mops/pure/core/entry/runner_registry.py +1 -10
  17. thds/mops/pure/core/lock/__init__.py +1 -0
  18. thds/mops/pure/core/lock/_acquire.py +2 -2
  19. thds/mops/pure/core/lock/maintain.py +22 -3
  20. thds/mops/pure/core/lock/write.py +19 -19
  21. thds/mops/pure/core/memo/__init__.py +1 -1
  22. thds/mops/pure/core/memo/results.py +5 -4
  23. thds/mops/pure/core/use_runner.py +21 -7
  24. thds/mops/pure/pickling/mprunner.py +21 -14
  25. thds/mops/pure/pickling/pickles.py +19 -8
  26. thds/mops/pure/pickling/remote.py +3 -1
  27. thds/mops/pure/runner/get_results.py +106 -0
  28. thds/mops/pure/runner/local.py +58 -87
  29. thds/mops/pure/runner/shim_builder.py +7 -7
  30. thds/mops/pure/runner/simple_shims.py +7 -0
  31. thds/mops/pure/runner/types.py +15 -4
  32. thds/mops/pure/tools/summarize/run_summary.py +9 -8
  33. {thds_mops-3.9.20250722213952.dist-info → thds_mops-3.9.20250724233724.dist-info}/METADATA +1 -1
  34. {thds_mops-3.9.20250722213952.dist-info → thds_mops-3.9.20250724233724.dist-info}/RECORD +37 -32
  35. {thds_mops-3.9.20250722213952.dist-info → thds_mops-3.9.20250724233724.dist-info}/WHEEL +0 -0
  36. {thds_mops-3.9.20250722213952.dist-info → thds_mops-3.9.20250724233724.dist-info}/entry_points.txt +0 -0
  37. {thds_mops-3.9.20250722213952.dist-info → thds_mops-3.9.20250724233724.dist-info}/top_level.txt +0 -0
@@ -1,3 +1,4 @@
1
+ import concurrent.futures
1
2
  import subprocess
2
3
  from typing import Sequence
3
4
 
@@ -19,3 +20,9 @@ def samethread_shim(shim_args: Sequence[str]) -> None:
19
20
  def subprocess_shim(shim_args: Sequence[str]) -> None:
20
21
  logger.debug("Running a mops function locally in a new subprocess.")
21
22
  subprocess.check_call(["python", "-m", "thds.mops.pure.core.entry.main", *shim_args])
23
+
24
+
25
+ def future_subprocess_shim(shim_args: Sequence[str]) -> concurrent.futures.Future:
26
+ """Use this if you really want a Future rather than just running the process"""
27
+ logger.debug("Running a mops function in a new subprocess, returning a Future.")
28
+ return concurrent.futures.ProcessPoolExecutor().submit(samethread_shim, shim_args)
@@ -1,25 +1,36 @@
1
1
  import typing as ty
2
2
 
3
+ from thds.core import futures
4
+
3
5
  from ..core.metadata import ResultMetadata
4
6
  from ..core.types import Args, F, Kwargs
5
7
 
6
- Shim = ty.Callable[[ty.Sequence[str]], ty.Any]
8
+ FutureShim = ty.Callable[[ty.Sequence[str]], futures.PFuture]
9
+ SyncShim = ty.Callable[[ty.Sequence[str]], None]
10
+ Shim = ty.Union[SyncShim, FutureShim]
7
11
  """A runner Shim is a way of getting back into a Python process with enough
8
12
  context to download the uploaded function and its arguments from the
9
13
  location where a runner placed it, and then invoke the function. All
10
14
  arguments are strings because it is assumed that this represents some
11
15
  kind of command line invocation.
12
16
 
13
- The Shim must be a blocking call, and its result(s) must be available
17
+ A SyncShim must be a blocking call, and its result(s) must be available
14
18
  immediately after its return.
19
+ A FutureShim must return a Future (with an 'add_done_callback' method)
20
+ that, when resolved, means that the result(s) are available.
15
21
  """
16
22
 
23
+ S = ty.TypeVar("S", SyncShim, FutureShim, Shim, covariant=True)
24
+
17
25
 
18
- class ShimBuilder(ty.Protocol):
19
- def __call__(self, __f: F, __args: Args, __kwargs: Kwargs) -> Shim:
26
+ class ShimBuilder(ty.Protocol, ty.Generic[S]):
27
+ def __call__(self, __f: ty.Callable, __args: Args, __kwargs: Kwargs) -> S:
20
28
  ... # pragma: no cover
21
29
 
22
30
 
31
+ SyncShimBuilder = ShimBuilder[SyncShim]
32
+ FutureShimBuilder = ShimBuilder[FutureShim]
33
+
23
34
  StorageRootURI = str
24
35
  SerializeArgsKwargs = ty.Callable[[StorageRootURI, F, Args, Kwargs], bytes]
25
36
  SerializeInvocation = ty.Callable[[StorageRootURI, F, bytes], bytes]
@@ -78,7 +78,7 @@ def _generate_log_filename(
78
78
  return run_directory / filename
79
79
 
80
80
 
81
- def _extract_source_uris(result: ty.Any) -> ty.Set[str]:
81
+ def extract_source_uris(obj: ty.Any) -> ty.Set[str]:
82
82
  uris: ty.Set[str] = set()
83
83
 
84
84
  def extract_uri(unknown: ty.Any) -> None:
@@ -94,15 +94,16 @@ def _extract_source_uris(result: ty.Any) -> ty.Set[str]:
94
94
  material = unknown.material
95
95
  if callable(material):
96
96
  mat = material()
97
- for uri in _extract_source_uris(mat):
97
+ # recurse!
98
+ for uri in extract_source_uris(mat):
98
99
  uris.add(uri)
99
100
 
100
101
  try:
101
- pickle_visit.recursive_visit(extract_uri, result)
102
+ pickle_visit.recursive_visit(extract_uri, obj)
102
103
  except pickle.PicklingError:
103
104
  pass
104
105
  except Exception as exc:
105
- logger.warning(f'Unexpected error trying to extract URIs from "%s"; {exc}', result)
106
+ logger.warning(f'Unexpected error trying to extract URIs from "%s"; {exc}', obj)
106
107
 
107
108
  return uris
108
109
 
@@ -115,7 +116,7 @@ def log_function_execution(
115
116
  runner_prefix: str = "",
116
117
  was_error: bool = False,
117
118
  return_value: ty.Any = None,
118
- args_kwargs: ty.Any = None,
119
+ args_kwargs_uris: ty.Collection[str] = (),
119
120
  ) -> None:
120
121
  if not run_directory:
121
122
  logger.debug("Not writing function summary for %s", memo_uri)
@@ -145,9 +146,9 @@ def log_function_execution(
145
146
  log_entry["remote_code_version"] = metadata.remote_code_version
146
147
  # we don't bother with invoked_at or remote_started_at because they can be
147
148
  # inferred from the timestamp and the wall times
148
- if source_uris := _extract_source_uris(args_kwargs):
149
- log_entry["uris_in_args_kwargs"] = sorted(source_uris)
150
- if source_uris := _extract_source_uris(return_value):
149
+ if args_kwargs_uris:
150
+ log_entry["uris_in_args_kwargs"] = sorted(args_kwargs_uris)
151
+ if source_uris := extract_source_uris(return_value):
151
152
  log_entry["uris_in_rvalue"] = sorted(source_uris)
152
153
 
153
154
  try:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: thds.mops
3
- Version: 3.9.20250722213952
3
+ Version: 3.9.20250724233724
4
4
  Summary: ML Ops tools for Trilliant Health
5
5
  Author-email: Trilliant Health <info@trillianthealth.com>
6
6
  Project-URL: Repository, https://github.com/TrilliantHealth/ds-monorepo
@@ -14,37 +14,41 @@ thds/mops/_utils/once.py,sha256=_LHkPbMJO4nqp0RIDj8VgIV3JoZYSQYKGdatdnT-19s,946
14
14
  thds/mops/_utils/temp.py,sha256=pcHkqIPghPfcZcwAFjCIzLfUWdIgXD3XC8Au1dk5l1k,948
15
15
  thds/mops/impure/__init__.py,sha256=VnrHPVgbOYUjkrVnnVicvNV39G6K6ENcWtCuV-BedW4,83
16
16
  thds/mops/impure/keyfunc.py,sha256=-THL-GPa6j1zjiHBONkiFzKHuOvE_kGdIVtz0nG4Mp8,524
17
- thds/mops/impure/runner.py,sha256=kaBHDLn64FEg_INVwD9_uZk809qyCJyYK8RaYbVUisY,2812
18
- thds/mops/k8s/__init__.py,sha256=y4bvR5DQLiriBV0I8CZoQdNlNrXWQ2VpcxY5lOrdnzU,669
17
+ thds/mops/impure/runner.py,sha256=UI1NZWMZ_5TQHfFKLnoiSm2zDR3zCunTKFmJoybkyCo,2840
18
+ thds/mops/k8s/__init__.py,sha256=zl4GVcCFRvPscyo6gvv5Lx0OKB7d3QjtVFjYurnxMuE,764
19
+ thds/mops/k8s/_launch.py,sha256=n4a3v6JNjcShFlBgRyL6JdS9My0ApggsjurtZFuKOnk,10893
19
20
  thds/mops/k8s/_shared.py,sha256=MR-s6ijWUHZGjxK_fsOpHuRDB6kuofjo5xiIb7ul2VM,86
20
21
  thds/mops/k8s/apply_yaml.py,sha256=hVW6dIVbNdzHdbGlc2VAPGkdByv_rH2oPybyIm7tKIM,820
21
22
  thds/mops/k8s/auth.py,sha256=mXFPZvyJYEPASsBatv1r8syB9AoayuHGptHHnNUg8LE,1517
22
- thds/mops/k8s/config.py,sha256=ha8ppDeFnDB2I9tCajiDcfZlamIk73OJe4lzD5buyXU,2993
23
+ thds/mops/k8s/batching.py,sha256=VJw6DhdhklOSu-iUW6r_BpAP7Jx62uoKV2Bpy0V9U_Q,8266
24
+ thds/mops/k8s/config.py,sha256=_znocX5BW8kfG_Cbq6f3apx5FqSihD7Tmic-SBkVjMQ,2992
23
25
  thds/mops/k8s/container_registry.py,sha256=qOiGCE4t_tLYgJDGrhKV9KNv48lF_AlwCDHyFgucd2s,539
24
- thds/mops/k8s/jobs.py,sha256=3u0jc5Fnll2ncnmcdTUHlcxJ_KYNK9s66W7r6ez49As,3271
25
- thds/mops/k8s/launch.py,sha256=EjLblGExh0paElOZWgevZdVzEZie1_4jQo7fKTrE1N0,10489
26
- thds/mops/k8s/logging.py,sha256=m4XnhxzLqlZa2zOObFhp_zv3juQfqfwcCughChBqcCo,9773
26
+ thds/mops/k8s/counts.py,sha256=W_gfXScvrEFskPFU9dEkI7V1I5ExXm9t_bUwO52lwtc,580
27
+ thds/mops/k8s/job_future.py,sha256=_wsH5Lh9qdcGqLZsvXYz8vAFgpV_nMYZ5d8dIFJA-eQ,3933
28
+ thds/mops/k8s/jobs.py,sha256=KcHxlPRukubRp_ddOm0tAX4COs7Ppv0mjbEdv4SAjmM,3359
29
+ thds/mops/k8s/logging.py,sha256=m_3Tn0XAFhUHdEicqRKnMzdK_hvSTCB7hsP1mIilKC4,10940
27
30
  thds/mops/k8s/namespace.py,sha256=Z6trVTU9WFashto4PqIhTcxu-foOF93W0TpgqCU7WIA,383
28
31
  thds/mops/k8s/node_selection.py,sha256=Gy2Jz8IxZblg2LmtGg8-MtKI4RmXz2AMXqFPP8OQyu0,2065
29
32
  thds/mops/k8s/retry.py,sha256=JVfP304kItpLs5nrONHE5UWkVWlrFGlV_oFQqhq3zHg,2846
30
33
  thds/mops/k8s/too_old_resource_version.py,sha256=S7ltVA-LrxUpQ8Q__AB0nQmezN8Mmnx5oKK62_baAKI,1500
34
+ thds/mops/k8s/uncertain_future.py,sha256=60v9yVlhnCDN_yUv8l4Z4KafR4TsTGxN7dprkGI8pQQ,7152
31
35
  thds/mops/k8s/wait_job.py,sha256=_X5lSn-3CE4V-_ra0kF1WtxkAiOgqSom8mU1-0hhMio,2445
32
36
  thds/mops/k8s/warn_image_backoff.py,sha256=ls_zLSnRbJjO4ICjq1Rk21EXh190l2dT6nKg-PT8Das,1934
33
- thds/mops/k8s/watch.py,sha256=pLjyJg94QuDYV-CdoEJD7emkrYe5i5kDUTjtUsYSq4w,11425
37
+ thds/mops/k8s/watch.py,sha256=iU3sgWEVyjNgVN9HObMoHoQyT8YPrApn4XZlE0sZcLA,14028
34
38
  thds/mops/k8s/tools/krsync.py,sha256=us7pXX0-bRMwD2oAno7Z6BJcPs6FgaUabHW0STyQJYg,1773
35
39
  thds/mops/k8s/tools/krsync.sh,sha256=fWgwkdzWnJeTbzEA_uBiIIi-bNU4nXAYj3dNovyRluU,747
36
- thds/mops/pure/__init__.py,sha256=kbG0lMvXRBS3LGbb2gPPE9-qjYMXrypyb2tJX2__aZc,1533
40
+ thds/mops/pure/__init__.py,sha256=3xLimQ2JWdeq1YgPs7bPwlwOspzPRwaR2w2KX7vfJU0,1624
37
41
  thds/mops/pure/_magic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
42
  thds/mops/pure/_magic/api.py,sha256=kSlediIZQYsmeHB8plP6osjvUuSEVW4NWdY9ADia12Y,5094
39
- thds/mops/pure/_magic/sauce.py,sha256=xmO6Kch-ofVnrVFkxWm84C0-ao9vVCYq0nGGMuYeaok,6333
40
- thds/mops/pure/_magic/shims.py,sha256=JI49ddv6lEUmNVsEl-XkGlsx2RpOMQoIOSSSfootYE8,1188
43
+ thds/mops/pure/_magic/sauce.py,sha256=xLaseOhoGgntmz6nZdj2te85sOaOiWExBLMGdeNmKsI,6870
44
+ thds/mops/pure/_magic/shims.py,sha256=CXN8wlHv039oKRzDtp5YFDlwGXmmaheWLCi2I95gSeM,1212
41
45
  thds/mops/pure/adls/__init__.py,sha256=fw67xxwnizBurScMa-_zWb94lo5gamEVRt27V4bR0jc,54
42
46
  thds/mops/pure/adls/_files.py,sha256=9m35Y4elWF0DjgAXVp4oi5CaY6fXWt8n67PilWxWJns,821
43
47
  thds/mops/pure/adls/blob_store.py,sha256=ZWr7CKKcI-jz1sWZq4Jwq6LYkhFNxp-EFnNh83EJd84,7374
44
48
  thds/mops/pure/adls/output_fqn.py,sha256=qnwdubjVwKShzZ5RruD0_85x86DtPwZNSgwADrdhrTs,748
45
49
  thds/mops/pure/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
50
  thds/mops/pure/core/content_addressed.py,sha256=RaCPvtM7bf0NnY5lNR5jPcNn2Moh-bmLtC4zOvdWjCU,1202
47
- thds/mops/pure/core/deferred_work.py,sha256=3vjfqWFlqLLMcmX4nHVaaiidrG5N5KyAYhw6R0hoMzI,3716
51
+ thds/mops/pure/core/deferred_work.py,sha256=zN-iRJj2lUB83SrxOC0JLhfkSWA6qIc1cvSScfkWKOM,3756
48
52
  thds/mops/pure/core/file_blob_store.py,sha256=N4m4LLrBZaqTJFR4D_eYl03a-n6yQBRsv0ID1bOS9TA,4298
49
53
  thds/mops/pure/core/metadata.py,sha256=xAL2iz0pXrcKapmYnNrqSZ8nH2GVakA167NSpAfwiCI,8276
50
54
  thds/mops/pure/core/output_naming.py,sha256=ntufOVNJiVPiUM-Azl9mFpDFhIxiB-V2je9dv9AUQhg,2283
@@ -57,25 +61,25 @@ thds/mops/pure/core/serialize_paths.py,sha256=bWI-AKNP_Tf29JGO7DKqshOh7b7gu51lfG
57
61
  thds/mops/pure/core/source.py,sha256=b0i58gE13e25lIV6ls1yPKH67SQ7aCuZmKDEHNr9Ux4,14682
58
62
  thds/mops/pure/core/types.py,sha256=w2g83miGhnjaWr2_4TW2Fc3BdIgoIHFbIr_wX1HC7A0,5452
59
63
  thds/mops/pure/core/uris.py,sha256=qO9_f-ro7kax6haNOPTPe81-_aUSRFELeeZH4PMTTU4,2694
60
- thds/mops/pure/core/use_runner.py,sha256=_YeKEjj6_9uc5UIjxcm-YKLUj4joApOdaTJCMaCLC2c,1547
64
+ thds/mops/pure/core/use_runner.py,sha256=m1Mu1XDr3xRf_u_VSiHfTG4TH6fnSg0IqwmtbLKG_oc,2103
61
65
  thds/mops/pure/core/entry/__init__.py,sha256=kiDcsj16CwjRSexOZW-4h4b4tDCYIS_eLS5wgu2yIlk,151
62
66
  thds/mops/pure/core/entry/main.py,sha256=b1F5lFDK_hnpvW3bqzt5MWDcpKvCXZpWdEHI8zroC4k,2061
63
67
  thds/mops/pure/core/entry/route_result.py,sha256=2LcS9M2mYtu56kso0YcMEZbR1mbTWZm0hFlbE2yaf4k,2741
64
- thds/mops/pure/core/entry/runner_registry.py,sha256=LgEifOYXgjwox1BlBordX1U6g6QB2dAPVU6S1b_iOlk,835
65
- thds/mops/pure/core/lock/__init__.py,sha256=EP_5T_CF175I01NrVR0eIaWu-k3OM-xsr9pal2i61rU,215
66
- thds/mops/pure/core/lock/_acquire.py,sha256=wIHvAlh0F4lzfgjga9_eFcfZtzx3G-uCsk06H42OXZA,9093
68
+ thds/mops/pure/core/entry/runner_registry.py,sha256=aPDCML7gM_zP6NfPnqx0_Q1oRHzgdaCa_XzYc5VIw7U,601
69
+ thds/mops/pure/core/lock/__init__.py,sha256=Fq5Fa9DGFcADFxfyFckSl1mYX7p8DAemjMKH9PMpb-s,240
70
+ thds/mops/pure/core/lock/_acquire.py,sha256=O__mQCUQy0mx-JGNgQjbaSPbfCOXkaiJealYt2Av7Cg,9079
67
71
  thds/mops/pure/core/lock/_funcs.py,sha256=j4g8yVWnrAMPDKqLlq8nTnccM1KHSJ3g71L1iWNbV2Q,969
68
72
  thds/mops/pure/core/lock/cli.py,sha256=uidtmgHB2y5LDkj7SQTncy_cNe1EfIseuiJPV9kcxBU,2488
69
- thds/mops/pure/core/lock/maintain.py,sha256=2VkqKxyp0bZkfM5wZV4Lz7zmZl7t5TOcCGNYfJNFGqs,5250
73
+ thds/mops/pure/core/lock/maintain.py,sha256=5IUQFAU96p46nNt6SMwTAlB2e0HGHJj8n7kqeRxb26M,5767
70
74
  thds/mops/pure/core/lock/read.py,sha256=Ct5eYMlkTlEaV5Yhw6HWsDD7VrgdhDZoI6AVIQ0ts-4,1255
71
75
  thds/mops/pure/core/lock/types.py,sha256=f32t_e2svMOXUVzcnLkEizw6Q47g3HPQsyAkGT2OKMs,993
72
- thds/mops/pure/core/lock/write.py,sha256=4z3W9rsRIs5ZI-_g2Q6ZplQdez6DxCGJ-HZikQI3dHo,5614
73
- thds/mops/pure/core/memo/__init__.py,sha256=OAgSWsup07EKxITr3yjwJ8eXbhU6-P1DVeZaYIgylgc,277
76
+ thds/mops/pure/core/lock/write.py,sha256=yuF2zRAzgYOmnet1GXZHwYT7oT1znVB3SPK1_j7orFA,5556
77
+ thds/mops/pure/core/memo/__init__.py,sha256=k64vX3XazDkP0m8MZgwqt0BV4vXg-ojK1EDhymucnuo,286
74
78
  thds/mops/pure/core/memo/calls.py,sha256=kvm6kn-CbOLxZuo86BvzEJw69p7VlEJ8_mCiWd6uz-g,3631
75
79
  thds/mops/pure/core/memo/function_memospace.py,sha256=PlQCs7dZ2Fu3gIjfzJMeOy7R5zPqYQDBp7OuViLqrpc,11644
76
80
  thds/mops/pure/core/memo/keyfunc.py,sha256=FAOEDzMcQ-0JvW4j1eaUzixnemo_373V-16kWZl7_i0,2053
77
81
  thds/mops/pure/core/memo/overwrite_params.py,sha256=ltuFxhr8gNo2iBoBz2eFPayjSV23gMdBuoLZD42lIAg,2425
78
- thds/mops/pure/core/memo/results.py,sha256=kaYJj542Ey5CQgiuCXVGVrKE6ZcdV5H9VD2OCSDi_38,3146
82
+ thds/mops/pure/core/memo/results.py,sha256=hEgwlNXRIzihjUMgrlKeHAXDDBmp7y6vQyemzc47hgY,3202
79
83
  thds/mops/pure/core/memo/unique_name_for_function.py,sha256=NGuBmK9c-UdgQP27I-WLMRlCMWJmPSdMymRm14mT1K0,2331
80
84
  thds/mops/pure/joblib/__init__.py,sha256=-3hSs-GsNzE_eNnwrdZBHAR_eaub5Uyl5GPYqBwEEPo,58
81
85
  thds/mops/pure/joblib/backend.py,sha256=F__6lrdc1-VcX4n4Pw7Lz1bBgeefShtRy2DQh6Fp-eI,2671
@@ -83,16 +87,17 @@ thds/mops/pure/joblib/batching.py,sha256=tPOATD28-YW7KcWa3IqKm-fhLaILzM792ApvU-_
83
87
  thds/mops/pure/pickling/__init__.py,sha256=WNdG8PdJCk-kYaXkvvPa--hjYGoUlBXG3w2X86yuhGo,156
84
88
  thds/mops/pure/pickling/_pickle.py,sha256=YB8xbqDiwdk8ccnVZ2_4kQn98V2JSrFqw2E3J-jEHlA,8081
85
89
  thds/mops/pure/pickling/memoize_only.py,sha256=oI5CMy6IEJc46Gb_BGWNUuAe3fysS7HxRSTajN0WssI,837
86
- thds/mops/pure/pickling/mprunner.py,sha256=dVbwQA8hzEL7UiwYXmzoGwN3_jbEtGoHDPMkRmo_UtA,8378
87
- thds/mops/pure/pickling/pickles.py,sha256=nCg7L7CqReNWDF8FAdEmCcuXVC_kLT5zuyW3V8Vvvs4,4704
88
- thds/mops/pure/pickling/remote.py,sha256=SynT9gVE3D2G2KO9oROa1iopMXxCXprP6_A3xl2IEJ4,5921
90
+ thds/mops/pure/pickling/mprunner.py,sha256=vabdHIVteddkU5ncOq73wWC7-naChW_3_vvAQArvjqU,8814
91
+ thds/mops/pure/pickling/pickles.py,sha256=CSlnjLssE0Ad8YzqyaKqWCSNyW5LiMFKiXO6hWAZmvU,5097
92
+ thds/mops/pure/pickling/remote.py,sha256=l4bIDc7jg7923IFKBeJE3oJYCN4OeT5tmtAg1eS_k7c,6011
89
93
  thds/mops/pure/pickling/sha256_b64.py,sha256=HL0cPixHPZYuZDVDBscxsnI-3a2amWEfw-LseOX-PyY,2916
90
94
  thds/mops/pure/runner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
91
- thds/mops/pure/runner/local.py,sha256=qdAfQVMS5EtZjjrvHfHjiXAQMoVOCxD2rzWdvc2aNbw,12004
92
- thds/mops/pure/runner/shim_builder.py,sha256=DkOXbPaOWPj2uUsJhjlWmh8ijG9OQc4ciHqa-vHPfXw,709
93
- thds/mops/pure/runner/simple_shims.py,sha256=oJ8sC5EVD-JFZx8CYE3_QwaQTuFa5F3IYH5PJ9mdMtY,702
95
+ thds/mops/pure/runner/get_results.py,sha256=1K6qf_Vg2YfUPfUuu103WyYsfS3e_ju6W7Z_PV01-pU,4053
96
+ thds/mops/pure/runner/local.py,sha256=tTRQcglYdf4PC7-smkqJAi-u2BQYR61g21gwrBIcEyY,10406
97
+ thds/mops/pure/runner/shim_builder.py,sha256=obs2-NipAB8w0NR8o90UQX_bmHYS69c-raL2JPw8yM4,821
98
+ thds/mops/pure/runner/simple_shims.py,sha256=r-kLmpSCwzjfzF-Ku43YKvrHMLpZR5jDmweo4Vk07O4,1069
94
99
  thds/mops/pure/runner/strings.py,sha256=PYAYMxZ2ehgahKIBXJilENNE6OrdNkueNBel8LPsoh8,26
95
- thds/mops/pure/runner/types.py,sha256=sdeGCig5a-tm4eHrpMCTFsrmh2CBrLfI3kCMdoYqZY0,1127
100
+ thds/mops/pure/runner/types.py,sha256=fEpZyLYd1mtM1lRX_1MANpbttnJge0Z1zNqC8tAAxnw,1566
96
101
  thds/mops/pure/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
97
102
  thds/mops/pure/tools/_pickle_dis.py,sha256=EyLgWP_dRzz1HIabGRTEGZFT_LZV5gmn4asJyFUAt4Y,6312
98
103
  thds/mops/pure/tools/history.py,sha256=dB7C2jq-0P3Fnv5Q3nzEkLehXdX0kaZZrGl1U1ns9DU,1048
@@ -101,11 +106,11 @@ thds/mops/pure/tools/sha256_b64_addressed.py,sha256=SECAiw3xSqpsrBBZix0MgJRTQrbH
101
106
  thds/mops/pure/tools/stress.py,sha256=N7C8kLpaGbImeEYlT5jsEl1metvsUu8cnfyQ8vFN0H8,2541
102
107
  thds/mops/pure/tools/summarize/__init__.py,sha256=MSmt_5Xg84uHqzTN38JwgseJK8rsJn_11A8WD99VtEo,61
103
108
  thds/mops/pure/tools/summarize/cli.py,sha256=7kDtn24ok8oBO3jFjlMmOK3jnZYpMoE_5Y8fmDH8Imc,11524
104
- thds/mops/pure/tools/summarize/run_summary.py,sha256=LUtvbankAYbss2NCF_XbNl05jkNgxYz_SLyERJlp4sk,5773
109
+ thds/mops/pure/tools/summarize/run_summary.py,sha256=w45qiQr7elrHDiK9Hgs85gtU3gwLuXa447ih1Y23BBY,5776
105
110
  thds/mops/testing/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
106
111
  thds/mops/testing/deferred_imports.py,sha256=f0ezCgQAtzTqW1yAOb0OWgsB9ZrlztLB894LtpWDaVw,3780
107
- thds_mops-3.9.20250722213952.dist-info/METADATA,sha256=qGHDc94PqxO9WS_21Nl0Vgsuh8X3UkvNnCPM1B96L-o,2225
108
- thds_mops-3.9.20250722213952.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
109
- thds_mops-3.9.20250722213952.dist-info/entry_points.txt,sha256=qKvCAaB80syXfxVR3xx6x9J0YJdaQWkIbVSw-NwFgMw,322
110
- thds_mops-3.9.20250722213952.dist-info/top_level.txt,sha256=LTZaE5SkWJwv9bwOlMbIhiS-JWQEEIcjVYnJrt-CriY,5
111
- thds_mops-3.9.20250722213952.dist-info/RECORD,,
112
+ thds_mops-3.9.20250724233724.dist-info/METADATA,sha256=wE4sHqv0dvJcdTGErt7PScdrJvkX3vuIl7mva645GOs,2225
113
+ thds_mops-3.9.20250724233724.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
114
+ thds_mops-3.9.20250724233724.dist-info/entry_points.txt,sha256=qKvCAaB80syXfxVR3xx6x9J0YJdaQWkIbVSw-NwFgMw,322
115
+ thds_mops-3.9.20250724233724.dist-info/top_level.txt,sha256=LTZaE5SkWJwv9bwOlMbIhiS-JWQEEIcjVYnJrt-CriY,5
116
+ thds_mops-3.9.20250724233724.dist-info/RECORD,,