parsl 2025.5.12__py3-none-any.whl → 2025.5.26__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.
parsl/addresses.py CHANGED
@@ -161,13 +161,12 @@ def get_any_address() -> str:
161
161
 
162
162
  def tcp_url(address: str, port: Union[str, int, None] = None) -> str:
163
163
  """Construct a tcp url safe for IPv4 and IPv6"""
164
+ port_suffix = f":{port}" if port else ""
164
165
  if address == "*":
165
- return "tcp://*"
166
+ return "tcp://*" + port_suffix
166
167
 
167
168
  ip_addr = ipaddress.ip_address(address)
168
169
 
169
- port_suffix = f":{port}" if port else ""
170
-
171
170
  if ip_addr.version == 6 and port_suffix:
172
171
  url = f"tcp://[{address}]{port_suffix}"
173
172
  else:
@@ -599,20 +599,20 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
599
599
  self._result_queue_thread.start()
600
600
  logger.debug("Started result queue thread: %r", self._result_queue_thread)
601
601
 
602
- def hold_worker(self, worker_id: str) -> None:
603
- """Puts a worker on hold, preventing scheduling of additional tasks to it.
602
+ def _hold_manager(self, manager_id: str) -> None:
603
+ """Puts a manager on hold, preventing scheduling of additional tasks to it.
604
604
 
605
605
  This is called "hold" mostly because this only stops scheduling of tasks,
606
- and does not actually kill the worker.
606
+ and does not actually kill the manager or workers.
607
607
 
608
608
  Parameters
609
609
  ----------
610
610
 
611
- worker_id : str
612
- Worker id to be put on hold
611
+ manager_id : str
612
+ Manager id to be put on hold
613
613
  """
614
- self.command_client.run("HOLD_WORKER;{}".format(worker_id))
615
- logger.debug("Sent hold request to manager: {}".format(worker_id))
614
+ self.command_client.run("HOLD_WORKER;{}".format(manager_id))
615
+ logger.debug("Sent hold request to manager: {}".format(manager_id))
616
616
 
617
617
  @property
618
618
  def outstanding(self) -> int:
@@ -656,7 +656,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
656
656
  for manager in managers:
657
657
  if manager['block_id'] == block_id:
658
658
  logger.debug("Sending hold to manager: {}".format(manager['manager']))
659
- self.hold_worker(manager['manager'])
659
+ self._hold_manager(manager['manager'])
660
660
 
661
661
  def submit(self, func, resource_specification, *args, **kwargs):
662
662
  """Submits work to the outgoing_q.
@@ -220,11 +220,11 @@ class Interchange:
220
220
  def process_command(self, monitoring_radio: Optional[MonitoringRadioSender]) -> None:
221
221
  """ Command server to run async command to the interchange
222
222
  """
223
- logger.debug("entering command_server section")
224
223
 
225
224
  reply: Any # the type of reply depends on the command_req received (aka this needs dependent types...)
226
225
 
227
226
  if self.command_channel in self.socks and self.socks[self.command_channel] == zmq.POLLIN:
227
+ logger.debug("entering command_server section")
228
228
 
229
229
  command_req = self.command_channel.recv_pyobj()
230
230
  logger.debug("Received command request: {}".format(command_req))
@@ -491,10 +491,7 @@ class Interchange:
491
491
  self._send_monitoring_info(monitoring_radio, m)
492
492
  else:
493
493
  interesting_managers.remove(manager_id)
494
- # logger.debug("Nothing to send to manager {}".format(manager_id))
495
494
  logger.debug("leaving _ready_managers section, with %s managers still interesting", len(interesting_managers))
496
- else:
497
- logger.debug("either no interesting managers or no tasks, so skipping manager pass")
498
495
 
499
496
  def process_results_incoming(self, interesting_managers: Set[bytes], monitoring_radio: Optional[MonitoringRadioSender]) -> None:
500
497
  # Receive any results and forward to client
@@ -605,8 +602,6 @@ def start_file_logger(filename: str, level: int = logging.DEBUG, format_string:
605
602
 
606
603
  )
607
604
 
608
- global logger
609
- logger = logging.getLogger(LOGGER_NAME)
610
605
  logger.setLevel(level)
611
606
  handler = logging.FileHandler(filename)
612
607
  handler.setLevel(level)
@@ -40,16 +40,18 @@ from parsl.utils import setproctitle
40
40
 
41
41
  from .errors import WorkQueueFailure, WorkQueueTaskFailure
42
42
 
43
+ IMPORT_EXCEPTION = None
43
44
  try:
44
- import work_queue as wq
45
- from work_queue import (
45
+ from ndcctools import work_queue as wq
46
+ from ndcctools.work_queue import (
46
47
  WORK_QUEUE_ALLOCATION_MODE_MAX_THROUGHPUT,
47
48
  WORK_QUEUE_DEFAULT_PORT,
48
49
  WorkQueue,
49
50
  )
50
- except ImportError:
51
+ except ImportError as e:
51
52
  _work_queue_enabled = False
52
53
  WORK_QUEUE_DEFAULT_PORT = 0
54
+ IMPORT_EXCEPTION = e
53
55
  else:
54
56
  _work_queue_enabled = True
55
57
 
@@ -257,7 +259,7 @@ class WorkQueueExecutor(BlockProviderExecutor, putils.RepresentationMixin):
257
259
  BlockProviderExecutor.__init__(self, provider=provider,
258
260
  block_error_handler=True)
259
261
  if not _work_queue_enabled:
260
- raise OptionalModuleMissing(['work_queue'], "WorkQueueExecutor requires the work_queue module.")
262
+ raise OptionalModuleMissing(['work_queue'], f"WorkQueueExecutor requires the work_queue module. More info: {IMPORT_EXCEPTION}")
261
263
 
262
264
  self.scaling_cores_per_worker = scaling_cores_per_worker
263
265
  self.label = label
@@ -5,6 +5,7 @@ import time
5
5
 
6
6
  from parsl.jobs.states import JobState, JobStatus
7
7
  from parsl.launchers import SingleNodeLauncher
8
+ from parsl.providers.errors import SubmitException
8
9
  from parsl.providers.pbspro.template import template_string
9
10
  from parsl.providers.torque.torque import TorqueProvider, translate_table
10
11
 
@@ -97,6 +98,14 @@ class PBSProProvider(TorqueProvider):
97
98
 
98
99
  retcode, stdout, stderr = self.execute_wait("qstat -f -F json {0}".format(job_id_list))
99
100
 
101
+ # If qstat failed do not update job state
102
+ if retcode != 0:
103
+ logger.warning("qstat failed with retcode:%s STDOUT:%s STDERR:%s",
104
+ retcode,
105
+ stdout.strip(),
106
+ stderr.strip())
107
+ return
108
+
100
109
  job_statuses = json.loads(stdout)
101
110
 
102
111
  if 'Jobs' in job_statuses:
@@ -198,10 +207,19 @@ class PBSProProvider(TorqueProvider):
198
207
  'job_stderr_path': job_stderr_path,
199
208
  }
200
209
  else:
201
- message = "Command '{}' failed with return code {}".format(launch_cmd, retcode)
202
- if (stdout is not None) and (stderr is not None):
203
- message += "\nstderr:{}\nstdout{}".format(stderr.strip(), stdout.strip())
204
- logger.error(message)
210
+ message = f"Submit command '{launch_cmd}' failed"
211
+ logger.error(
212
+ f"{message}\n"
213
+ f" Return code: {retcode}\n"
214
+ f" STDOUT: {stdout.strip()}\n"
215
+ f" STDERR: {stderr.strip()}"
216
+ )
217
+ raise SubmitException(
218
+ job_name=job_name,
219
+ message=message,
220
+ stdout=stdout,
221
+ stderr=stderr,
222
+ )
205
223
 
206
224
  return job_id
207
225
 
@@ -12,12 +12,15 @@ from parsl.executors.high_throughput.interchange import Interchange
12
12
  from parsl.executors.high_throughput.manager_selector import RandomManagerSelector
13
13
 
14
14
 
15
- def make_interchange(*, interchange_address: Optional[str], cert_dir: Optional[str]) -> Interchange:
15
+ def make_interchange(*,
16
+ interchange_address: Optional[str],
17
+ cert_dir: Optional[str],
18
+ worker_ports: Optional[tuple[int, int]] = None) -> Interchange:
16
19
  return Interchange(interchange_address=interchange_address,
17
20
  cert_dir=cert_dir,
18
21
  client_address="127.0.0.1",
19
22
  client_ports=(50055, 50056, 50057),
20
- worker_ports=None,
23
+ worker_ports=worker_ports,
21
24
  worker_port_range=(54000, 55000),
22
25
  hub_address=None,
23
26
  hub_zmq_port=None,
@@ -105,3 +108,10 @@ def test_limited_interface_binding(cert_dir: Optional[str]):
105
108
  assert len(matched_conns) == 1
106
109
  # laddr.ip can return ::ffff:127.0.0.1 when using IPv6
107
110
  assert address in matched_conns[0].laddr.ip
111
+
112
+
113
+ @pytest.mark.local
114
+ @pytest.mark.parametrize("encrypted", (True, False), indirect=True)
115
+ def test_fixed_ports(cert_dir: Optional[str]):
116
+ ix = make_interchange(interchange_address=None, cert_dir=cert_dir, worker_ports=(51117, 51118))
117
+ assert ix.interchange_address == "*"
@@ -54,26 +54,8 @@ def htex_filesystem_config():
54
54
  return c
55
55
 
56
56
 
57
- def workqueue_config():
58
- from parsl.tests.configs.workqueue_ex import fresh_config
59
- c = fresh_config()
60
- c.monitoring = MonitoringHub(
61
- hub_address="localhost",
62
- resource_monitoring_interval=1)
63
- return c
64
-
65
-
66
- def taskvine_config():
67
- c = Config(executors=[TaskVineExecutor(manager_config=TaskVineManagerConfig(port=9000),
68
- worker_launch_method='provider')],
69
-
70
- monitoring=MonitoringHub(hub_address="localhost",
71
- resource_monitoring_interval=1))
72
- return c
73
-
74
-
75
57
  @pytest.mark.local
76
- @pytest.mark.parametrize("fresh_config", [htex_config, htex_filesystem_config, htex_udp_config, workqueue_config, taskvine_config])
58
+ @pytest.mark.parametrize("fresh_config", [htex_config, htex_filesystem_config, htex_udp_config])
77
59
  def test_row_counts(tmpd_cwd, fresh_config):
78
60
  # this is imported here rather than at module level because
79
61
  # it isn't available in a plain parsl install, so this module
@@ -1,3 +1,5 @@
1
+ import os
2
+
1
3
  import pytest
2
4
 
3
5
  import parsl
@@ -18,6 +20,10 @@ apps = []
18
20
 
19
21
  @pytest.mark.local
20
22
  @pytest.mark.radical
23
+ @pytest.mark.skipif(
24
+ os.environ.get("RADICAL_CI") != "1",
25
+ reason="Only runs in Radical CI workflow"
26
+ )
21
27
  def test_radical_mpi(n=7):
22
28
  # rank size should be > 1 for the
23
29
  # radical runtime system to run this function in MPI env
@@ -13,6 +13,7 @@ from parsl.addresses import tcp_url
13
13
  ("::ffff:127.0.0.1", None, "tcp://::ffff:127.0.0.1"),
14
14
  ("::ffff:127.0.0.1", None, "tcp://::ffff:127.0.0.1"),
15
15
  ("*", None, "tcp://*"),
16
+ ("*", 55001, "tcp://*:55001")
16
17
  ])
17
18
  def test_tcp_url(address, port, expected):
18
19
  """Confirm valid address generation"""
parsl/version.py CHANGED
@@ -3,4 +3,4 @@
3
3
  Year.Month.Day[alpha/beta/..]
4
4
  Alphas will be numbered like this -> 2024.12.10a0
5
5
  """
6
- VERSION = '2025.05.12'
6
+ VERSION = '2025.05.26'
@@ -220,11 +220,11 @@ class Interchange:
220
220
  def process_command(self, monitoring_radio: Optional[MonitoringRadioSender]) -> None:
221
221
  """ Command server to run async command to the interchange
222
222
  """
223
- logger.debug("entering command_server section")
224
223
 
225
224
  reply: Any # the type of reply depends on the command_req received (aka this needs dependent types...)
226
225
 
227
226
  if self.command_channel in self.socks and self.socks[self.command_channel] == zmq.POLLIN:
227
+ logger.debug("entering command_server section")
228
228
 
229
229
  command_req = self.command_channel.recv_pyobj()
230
230
  logger.debug("Received command request: {}".format(command_req))
@@ -491,10 +491,7 @@ class Interchange:
491
491
  self._send_monitoring_info(monitoring_radio, m)
492
492
  else:
493
493
  interesting_managers.remove(manager_id)
494
- # logger.debug("Nothing to send to manager {}".format(manager_id))
495
494
  logger.debug("leaving _ready_managers section, with %s managers still interesting", len(interesting_managers))
496
- else:
497
- logger.debug("either no interesting managers or no tasks, so skipping manager pass")
498
495
 
499
496
  def process_results_incoming(self, interesting_managers: Set[bytes], monitoring_radio: Optional[MonitoringRadioSender]) -> None:
500
497
  # Receive any results and forward to client
@@ -605,8 +602,6 @@ def start_file_logger(filename: str, level: int = logging.DEBUG, format_string:
605
602
 
606
603
  )
607
604
 
608
- global logger
609
- logger = logging.getLogger(LOGGER_NAME)
610
605
  logger.setLevel(level)
611
606
  handler = logging.FileHandler(filename)
612
607
  handler.setLevel(level)
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: parsl
3
- Version: 2025.5.12
3
+ Version: 2025.5.26
4
4
  Summary: Simple data dependent workflows in Python
5
5
  Home-page: https://github.com/Parsl/parsl
6
- Download-URL: https://github.com/Parsl/parsl/archive/2025.05.12.tar.gz
6
+ Download-URL: https://github.com/Parsl/parsl/archive/2025.05.26.tar.gz
7
7
  Author: The Parsl Team
8
8
  Author-email: parsl@googlegroups.com
9
9
  License: Apache 2.0
@@ -1,5 +1,5 @@
1
1
  parsl/__init__.py,sha256=65VfBnxw2k8V3sHsbhKoUCqG-ps2XP2l3x3ALMqQ13Y,1777
2
- parsl/addresses.py,sha256=gzQzyIoamo3Eq7AQ4MnyCwyZDRuu0gf7jXPEkb2YA8Y,5277
2
+ parsl/addresses.py,sha256=z5GnIWdbzz4klRiMZtX8XmRT7OP8dJYvAk8RIKD2kzI,5290
3
3
  parsl/config.py,sha256=p5HQoxLj5aMagUAYfngcXG2kw0s6SJoc6u7vH2sVhPU,9635
4
4
  parsl/curvezmq.py,sha256=6Zi7RqTP_eKWi3DFgapfK2t-Jw8vJS-ZtN1bsrByPeo,7073
5
5
  parsl/errors.py,sha256=SzINzQFZDBDbj9l-DPQznD0TbGkNhHIRAPkcBCogf_A,1019
@@ -8,7 +8,7 @@ parsl/multiprocessing.py,sha256=JNAfgdZvQSsxVyUp229OOUqWwf_ZUhpmw8X9CdF3i6k,3614
8
8
  parsl/process_loggers.py,sha256=uQ7Gd0W72Jz7rrcYlOMfLsAEhkRltxXJL2MgdduJjEw,1136
9
9
  parsl/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  parsl/utils.py,sha256=codTX6_KLhgeTwNkRzc1lo4bgc1M93eJ-lkqOO98fvk,14331
11
- parsl/version.py,sha256=RsCbeu_L8VROB1PZG6_NFSRMOmwcZhsdiquUwFc4V_g,131
11
+ parsl/version.py,sha256=EaScyVawSKbx-5eXxTDv4N5r-ccy_-Hm8yHlbdPlkiA,131
12
12
  parsl/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
13
  parsl/app/app.py,sha256=0gbM4AH2OtFOLsv07I5nglpElcwMSOi-FzdZZfrk7So,8532
14
14
  parsl/app/bash.py,sha256=jm2AvePlCT9DZR7H_4ANDWxatp5dN_22FUlT_gWhZ-g,5528
@@ -73,8 +73,8 @@ parsl/executors/flux/executor.py,sha256=ii1i5V7uQnhf1BDq5nnMscmmpXJkCWtrFCuBbDaP
73
73
  parsl/executors/flux/flux_instance_manager.py,sha256=5T3Rp7ZM-mlT0Pf0Gxgs5_YmnaPrSF9ec7zvRfLfYJw,2129
74
74
  parsl/executors/high_throughput/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
75
75
  parsl/executors/high_throughput/errors.py,sha256=k2XuvvFdUfNs2foHFnxmS-BToRMfdXpYEa4EF3ELKq4,1554
76
- parsl/executors/high_throughput/executor.py,sha256=VVKe3gveCqa3rERAqhVNsWifSrLqyMcUwpdyHCsYdz8,39663
77
- parsl/executors/high_throughput/interchange.py,sha256=n_mQiaOFUushQl87nHugMeNShO0X5zCHHR3N1EF28aU,28975
76
+ parsl/executors/high_throughput/executor.py,sha256=8iqced7UU44emOlFY6Z1iD5M8752EozY6UMNhYMbpQY,39685
77
+ parsl/executors/high_throughput/interchange.py,sha256=gDCHe0UeKUAch7byR-FKJ7Tsrk39jGoTcVx3ERW6PkA,28719
78
78
  parsl/executors/high_throughput/manager_record.py,sha256=ZMsqFxvreGLRXAw3N-JnODDa9Qfizw2tMmcBhm4lco4,490
79
79
  parsl/executors/high_throughput/manager_selector.py,sha256=UKcUE6v0tO7PDMTThpKSKxVpOpOUilxDL7UbNgpZCxo,2116
80
80
  parsl/executors/high_throughput/monitoring_info.py,sha256=HC0drp6nlXQpAop5PTUKNjdXMgtZVvrBL0JzZJebPP4,298
@@ -100,7 +100,7 @@ parsl/executors/taskvine/utils.py,sha256=iSrIogeiauL3UNy_9tiZp1cBSNn6fIJkMYQRVi1
100
100
  parsl/executors/workqueue/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
101
101
  parsl/executors/workqueue/errors.py,sha256=XO2naYhAsHHyiOBH6hpObg3mPNDmvMoFqErsj0-v7jc,541
102
102
  parsl/executors/workqueue/exec_parsl_function.py,sha256=YXKVVIa4zXmOtz-0Ca4E_5nQfN_3S2bh2tB75uZZB4w,7774
103
- parsl/executors/workqueue/executor.py,sha256=dwsUuXoqEVJXSENgjTN_063OzjKrIi6tHIR3aYgYyMc,49717
103
+ parsl/executors/workqueue/executor.py,sha256=kE0vNN4cSau5p3R6uRDI20THN8e4dBGPHiGKWx5xpo4,49827
104
104
  parsl/executors/workqueue/parsl_coprocess.py,sha256=cF1UmTgVLoey6QzBcbYgEiEsRidSaFfuO54f1HFw_EM,5737
105
105
  parsl/executors/workqueue/parsl_coprocess_stub.py,sha256=_bJmpPIgL42qM6bVzeEKt1Mn1trSP41rtJguXxPGfHI,735
106
106
  parsl/jobs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -180,7 +180,7 @@ parsl/providers/lsf/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu
180
180
  parsl/providers/lsf/lsf.py,sha256=dB3CwYY39rM7E2dg3eP2UkeNHvatBxfl6JJns6FvLEY,10661
181
181
  parsl/providers/lsf/template.py,sha256=leQ_TpXv7ePMzbHfLaWvqMR0VORxlp-hjX5JxtkcwwU,269
182
182
  parsl/providers/pbspro/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
183
- parsl/providers/pbspro/pbspro.py,sha256=fumEUxwfjO-DDO2UQrvYaZgNULjWy1vEi8qd7WrgrkQ,8308
183
+ parsl/providers/pbspro/pbspro.py,sha256=vzopQ80iXcl4Wx0_Bs5OtadYGeoGdbDgK7YHfjUjG_Y,8826
184
184
  parsl/providers/pbspro/template.py,sha256=y-Dher--t5Eury-c7cAuSZs9FEUXWiruFUI07v81558,315
185
185
  parsl/providers/slurm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
186
186
  parsl/providers/slurm/slurm.py,sha256=HHf3HMJWa2XcztvrM55eapqOs1r8iGg0EHn8b3xxJ_8,15773
@@ -334,10 +334,10 @@ parsl/tests/test_htex/test_missing_worker.py,sha256=gyp5i7_t-JHyJGtz_eXZKKBY5w8o
334
334
  parsl/tests/test_htex/test_multiple_disconnected_blocks.py,sha256=2vXZoIx4NuAWYuiNoL5Gxr85w72qZ7Kdb3JGh0FufTg,1867
335
335
  parsl/tests/test_htex/test_resource_spec_validation.py,sha256=JqboQRRFV0tEfWrGOdYT9pHazsUjyZLbF7qqnLFS_-A,914
336
336
  parsl/tests/test_htex/test_worker_failure.py,sha256=Uz-RHI-LK78FMjXUvrUFmo4iYfmpDVBUcBxxRb3UG9M,603
337
- parsl/tests/test_htex/test_zmq_binding.py,sha256=WNFsCKKfid2uEfem0WLgl1wnBncIabpAv6kmg3imBxk,4001
337
+ parsl/tests/test_htex/test_zmq_binding.py,sha256=G7D2_p9vOekgpB50MBiPRwtIz98DEkUpMqA3rdwzYTQ,4397
338
338
  parsl/tests/test_monitoring/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
339
339
  parsl/tests/test_monitoring/test_app_names.py,sha256=A-mOMCVhZDnUyJp32fsTUkHdcyval8o7WPEWacDkbD4,2208
340
- parsl/tests/test_monitoring/test_basic.py,sha256=L31TOi1u1gKjcBPmhquYzXLwga6fkVU5wGKMNWWD0mg,4592
340
+ parsl/tests/test_monitoring/test_basic.py,sha256=3_lQ8KPxHPc6MT1UhACo7H-D7pBdy4Mxv4c4ztLv4-s,3947
341
341
  parsl/tests/test_monitoring/test_db_locks.py,sha256=3s3c1xhKo230ZZIJ3f1Ca4U7LcEdXnanOGVXQyNlk2U,2895
342
342
  parsl/tests/test_monitoring/test_exit_helper.py,sha256=ob8Qd1hlkq_mowygfPetTnYN9LfuqeXHRpPilSfDSog,1232
343
343
  parsl/tests/test_monitoring/test_fuzz_zmq.py,sha256=SQNNHhXxHB_LwW4Ujqkgut3lbG0XVW-hliPagQQpiTc,3449
@@ -393,7 +393,7 @@ parsl/tests/test_python_apps/test_simple.py,sha256=LYGjdHvRizTpYzZePPvwKSPwrr2MP
393
393
  parsl/tests/test_python_apps/test_timeout.py,sha256=uENfT-1DharQkqkeG7a89E-gU1gjE7ATJrBZGUKvZSA,998
394
394
  parsl/tests/test_python_apps/test_type5.py,sha256=kUyA1NuFu-DDXsJNNvJLZVyewZBt7QAOhcGm2DWFTQw,777
395
395
  parsl/tests/test_radical/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
396
- parsl/tests/test_radical/test_mpi_funcs.py,sha256=PSnLE2IQTIXIysRvmFh2xZ-4wnBL9GeiwXQjW-0z6dk,765
396
+ parsl/tests/test_radical/test_mpi_funcs.py,sha256=nKy5V2w48QYB_wJsp5E3dy0LBdz7a3qPBhBCsbNoa_Y,886
397
397
  parsl/tests/test_regression/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
398
398
  parsl/tests/test_regression/test_1480.py,sha256=sJjcX8O0eL_OG7L3skjT3JaIUyFC-kk0ui3puaDatKA,546
399
399
  parsl/tests/test_regression/test_1606_wait_for_current_tasks.py,sha256=frqPtaiVysevj9nCWoQlAeh9K1jQO5zaahr9ev_Mx_0,1134
@@ -451,7 +451,7 @@ parsl/tests/test_utils/test_execute_wait.py,sha256=J796rGuv2qi2spChgAPFB1oPETdnv
451
451
  parsl/tests/test_utils/test_representation_mixin.py,sha256=kUZeIDwA2rlbJ3-beGzLLwf3dOplTMCrWJN87etHcyY,1633
452
452
  parsl/tests/test_utils/test_sanitize_dns.py,sha256=8P_v5a5JLGU76OYf0LtclAwqJxGU0fMh_OZMVkMke3I,2954
453
453
  parsl/tests/unit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
454
- parsl/tests/unit/test_address.py,sha256=LL9qhp00JFG5lDN7-lY1YtuhTDlKHXHHp3a9TX06c84,682
454
+ parsl/tests/unit/test_address.py,sha256=0JxaEyvEiLIr5aKvaNnSv0Z9ta3kNllsLS_aby23QPs,716
455
455
  parsl/tests/unit/test_file.py,sha256=vLycnYcv3bvSzL-FV8WdoibqTyb41BrH1LUYBavobsg,2850
456
456
  parsl/tests/unit/test_globus_compute_executor.py,sha256=9BWKZ4C03tQ5gZ3jxIsDt5j2yyYHa_VHqULJPeM7YPM,3238
457
457
  parsl/tests/unit/test_usage_tracking.py,sha256=xEfUlbBRpsFdUdOrCsk1Kz5AfmMxJT7f0_esZl8Ft-0,1884
@@ -459,13 +459,13 @@ parsl/usage_tracking/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
459
459
  parsl/usage_tracking/api.py,sha256=iaCY58Dc5J4UM7_dJzEEs871P1p1HdxBMtNGyVdzc9g,1821
460
460
  parsl/usage_tracking/levels.py,sha256=xbfzYEsd55KiZJ-mzNgPebvOH4rRHum04hROzEf41tU,291
461
461
  parsl/usage_tracking/usage.py,sha256=8hq1UPdFlVcC0V3aj0ve-MvCyvwK8Xr3CVuSto3dTW4,9165
462
- parsl-2025.5.12.data/scripts/exec_parsl_function.py,sha256=YXKVVIa4zXmOtz-0Ca4E_5nQfN_3S2bh2tB75uZZB4w,7774
463
- parsl-2025.5.12.data/scripts/interchange.py,sha256=PnRAYR8nhJjfo6GcBEcWNbIVcNt4cjGbeIRVMd_HxbM,28962
464
- parsl-2025.5.12.data/scripts/parsl_coprocess.py,sha256=zrVjEqQvFOHxsLufPi00xzMONagjVwLZbavPM7bbjK4,5722
465
- parsl-2025.5.12.data/scripts/process_worker_pool.py,sha256=__gFeFQJpV5moRofj3WKQCnKp6gmzieXjzkmzVuTmX4,41123
466
- parsl-2025.5.12.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
467
- parsl-2025.5.12.dist-info/METADATA,sha256=SmVGzwzb6jNj-gC8No6q3M1BbCPvfsMB-GUhpmR4yS4,4023
468
- parsl-2025.5.12.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
469
- parsl-2025.5.12.dist-info/entry_points.txt,sha256=XqnsWDYoEcLbsMcpnYGKLEnSBmaIe1YoM5YsBdJG2tI,176
470
- parsl-2025.5.12.dist-info/top_level.txt,sha256=PIheYoUFQtF2icLsgOykgU-Cjuwr2Oi6On2jo5RYgRM,6
471
- parsl-2025.5.12.dist-info/RECORD,,
462
+ parsl-2025.5.26.data/scripts/exec_parsl_function.py,sha256=YXKVVIa4zXmOtz-0Ca4E_5nQfN_3S2bh2tB75uZZB4w,7774
463
+ parsl-2025.5.26.data/scripts/interchange.py,sha256=ESVMe6rIAzTqZrXp1gzIPcl3jAStLfmYeH2-rG0RoZQ,28706
464
+ parsl-2025.5.26.data/scripts/parsl_coprocess.py,sha256=zrVjEqQvFOHxsLufPi00xzMONagjVwLZbavPM7bbjK4,5722
465
+ parsl-2025.5.26.data/scripts/process_worker_pool.py,sha256=__gFeFQJpV5moRofj3WKQCnKp6gmzieXjzkmzVuTmX4,41123
466
+ parsl-2025.5.26.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
467
+ parsl-2025.5.26.dist-info/METADATA,sha256=ftY4oT1kBRYDTickFiyqTq7XZzR8klGI--Q1mNK2teI,4023
468
+ parsl-2025.5.26.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
469
+ parsl-2025.5.26.dist-info/entry_points.txt,sha256=XqnsWDYoEcLbsMcpnYGKLEnSBmaIe1YoM5YsBdJG2tI,176
470
+ parsl-2025.5.26.dist-info/top_level.txt,sha256=PIheYoUFQtF2icLsgOykgU-Cjuwr2Oi6On2jo5RYgRM,6
471
+ parsl-2025.5.26.dist-info/RECORD,,