experimaestro 1.5.1__py3-none-any.whl → 2.0.0a8__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.

Potentially problematic release.


This version of experimaestro might be problematic. Click here for more details.

Files changed (118) hide show
  1. experimaestro/__init__.py +14 -4
  2. experimaestro/__main__.py +3 -423
  3. experimaestro/annotations.py +14 -4
  4. experimaestro/cli/__init__.py +311 -0
  5. experimaestro/{filter.py → cli/filter.py} +23 -9
  6. experimaestro/cli/jobs.py +268 -0
  7. experimaestro/cli/progress.py +269 -0
  8. experimaestro/click.py +0 -35
  9. experimaestro/commandline.py +3 -7
  10. experimaestro/connectors/__init__.py +29 -14
  11. experimaestro/connectors/local.py +19 -10
  12. experimaestro/connectors/ssh.py +27 -8
  13. experimaestro/core/arguments.py +45 -3
  14. experimaestro/core/callbacks.py +52 -0
  15. experimaestro/core/context.py +8 -9
  16. experimaestro/core/identifier.py +310 -0
  17. experimaestro/core/objects/__init__.py +44 -0
  18. experimaestro/core/{objects.py → objects/config.py} +399 -772
  19. experimaestro/core/objects/config_utils.py +58 -0
  20. experimaestro/core/objects/config_walk.py +151 -0
  21. experimaestro/core/objects.pyi +15 -45
  22. experimaestro/core/serialization.py +63 -9
  23. experimaestro/core/serializers.py +1 -8
  24. experimaestro/core/types.py +104 -66
  25. experimaestro/experiments/cli.py +154 -72
  26. experimaestro/experiments/configuration.py +10 -1
  27. experimaestro/generators.py +6 -1
  28. experimaestro/ipc.py +4 -1
  29. experimaestro/launcherfinder/__init__.py +1 -1
  30. experimaestro/launcherfinder/base.py +2 -18
  31. experimaestro/launcherfinder/parser.py +8 -3
  32. experimaestro/launcherfinder/registry.py +52 -140
  33. experimaestro/launcherfinder/specs.py +49 -10
  34. experimaestro/launchers/direct.py +0 -47
  35. experimaestro/launchers/slurm/base.py +54 -14
  36. experimaestro/mkdocs/__init__.py +1 -1
  37. experimaestro/mkdocs/base.py +6 -8
  38. experimaestro/notifications.py +38 -12
  39. experimaestro/progress.py +406 -0
  40. experimaestro/run.py +24 -3
  41. experimaestro/scheduler/__init__.py +18 -1
  42. experimaestro/scheduler/base.py +108 -808
  43. experimaestro/scheduler/dynamic_outputs.py +184 -0
  44. experimaestro/scheduler/experiment.py +387 -0
  45. experimaestro/scheduler/jobs.py +475 -0
  46. experimaestro/scheduler/signal_handler.py +32 -0
  47. experimaestro/scheduler/state.py +75 -0
  48. experimaestro/scheduler/workspace.py +27 -8
  49. experimaestro/scriptbuilder.py +18 -3
  50. experimaestro/server/__init__.py +36 -5
  51. experimaestro/server/data/1815e00441357e01619e.ttf +0 -0
  52. experimaestro/server/data/2463b90d9a316e4e5294.woff2 +0 -0
  53. experimaestro/server/data/2582b0e4bcf85eceead0.ttf +0 -0
  54. experimaestro/server/data/89999bdf5d835c012025.woff2 +0 -0
  55. experimaestro/server/data/914997e1bdfc990d0897.ttf +0 -0
  56. experimaestro/server/data/c210719e60948b211a12.woff2 +0 -0
  57. experimaestro/server/data/index.css +5187 -5068
  58. experimaestro/server/data/index.css.map +1 -1
  59. experimaestro/server/data/index.js +68887 -68064
  60. experimaestro/server/data/index.js.map +1 -1
  61. experimaestro/settings.py +45 -5
  62. experimaestro/sphinx/__init__.py +7 -17
  63. experimaestro/taskglobals.py +7 -2
  64. experimaestro/tests/core/__init__.py +0 -0
  65. experimaestro/tests/core/test_generics.py +206 -0
  66. experimaestro/tests/definitions_types.py +5 -3
  67. experimaestro/tests/launchers/bin/sbatch +34 -7
  68. experimaestro/tests/launchers/bin/srun +5 -0
  69. experimaestro/tests/launchers/common.py +17 -5
  70. experimaestro/tests/launchers/config_slurm/launchers.py +25 -0
  71. experimaestro/tests/restart.py +10 -5
  72. experimaestro/tests/tasks/all.py +23 -10
  73. experimaestro/tests/tasks/foreign.py +2 -4
  74. experimaestro/tests/test_checkers.py +2 -2
  75. experimaestro/tests/test_dependencies.py +11 -17
  76. experimaestro/tests/test_experiment.py +73 -0
  77. experimaestro/tests/test_file_progress.py +425 -0
  78. experimaestro/tests/test_file_progress_integration.py +477 -0
  79. experimaestro/tests/test_findlauncher.py +12 -5
  80. experimaestro/tests/test_forward.py +5 -5
  81. experimaestro/tests/test_generators.py +93 -0
  82. experimaestro/tests/test_identifier.py +182 -158
  83. experimaestro/tests/test_instance.py +19 -27
  84. experimaestro/tests/test_objects.py +13 -20
  85. experimaestro/tests/test_outputs.py +6 -6
  86. experimaestro/tests/test_param.py +68 -30
  87. experimaestro/tests/test_progress.py +4 -4
  88. experimaestro/tests/test_serializers.py +24 -64
  89. experimaestro/tests/test_ssh.py +7 -0
  90. experimaestro/tests/test_tags.py +50 -21
  91. experimaestro/tests/test_tasks.py +42 -51
  92. experimaestro/tests/test_tokens.py +11 -8
  93. experimaestro/tests/test_types.py +24 -21
  94. experimaestro/tests/test_validation.py +67 -110
  95. experimaestro/tests/token_reschedule.py +1 -1
  96. experimaestro/tokens.py +24 -13
  97. experimaestro/tools/diff.py +8 -1
  98. experimaestro/typingutils.py +20 -11
  99. experimaestro/utils/asyncio.py +6 -2
  100. experimaestro/utils/multiprocessing.py +44 -0
  101. experimaestro/utils/resources.py +11 -3
  102. {experimaestro-1.5.1.dist-info → experimaestro-2.0.0a8.dist-info}/METADATA +28 -36
  103. experimaestro-2.0.0a8.dist-info/RECORD +166 -0
  104. {experimaestro-1.5.1.dist-info → experimaestro-2.0.0a8.dist-info}/WHEEL +1 -1
  105. {experimaestro-1.5.1.dist-info → experimaestro-2.0.0a8.dist-info}/entry_points.txt +0 -4
  106. experimaestro/launchers/slurm/cli.py +0 -29
  107. experimaestro/launchers/slurm/configuration.py +0 -597
  108. experimaestro/scheduler/environment.py +0 -94
  109. experimaestro/server/data/016b4a6cdced82ab3aa1.ttf +0 -0
  110. experimaestro/server/data/50701fbb8177c2dde530.ttf +0 -0
  111. experimaestro/server/data/878f31251d960bd6266f.woff2 +0 -0
  112. experimaestro/server/data/b041b1fa4fe241b23445.woff2 +0 -0
  113. experimaestro/server/data/b6879d41b0852f01ed5b.woff2 +0 -0
  114. experimaestro/server/data/d75e3fd1eb12e9bd6655.ttf +0 -0
  115. experimaestro/tests/launchers/config_slurm/launchers.yaml +0 -134
  116. experimaestro/utils/yaml.py +0 -202
  117. experimaestro-1.5.1.dist-info/RECORD +0 -148
  118. {experimaestro-1.5.1.dist-info → experimaestro-2.0.0a8.dist-info/licenses}/LICENSE +0 -0
experimaestro/tokens.py CHANGED
@@ -1,10 +1,12 @@
1
- """Tokens are special types of dependency controlling the access to
1
+ """Tokens are special types of dependency controlling the access to
2
2
  a computational resource (e.g. number of launched jobs, etc.)
3
3
  """
4
4
 
5
5
  from dataclasses import dataclass
6
6
  import sys
7
7
  from pathlib import Path
8
+
9
+ from omegaconf import DictConfig
8
10
  from experimaestro.core.objects import Config
9
11
  import fasteners
10
12
  import threading
@@ -14,7 +16,6 @@ from typing import Dict
14
16
  from experimaestro.launcherfinder.base import TokenConfiguration
15
17
 
16
18
  from experimaestro.launcherfinder.registry import LauncherRegistry
17
- from experimaestro.utils.yaml import YAMLDict
18
19
 
19
20
  from .ipc import ipcom
20
21
  from .locking import Lock, LockError
@@ -58,6 +59,8 @@ class CounterTokenLock(Lock):
58
59
 
59
60
 
60
61
  class CounterTokenDependency(Dependency):
62
+ """A dependency onto a token"""
63
+
61
64
  def __init__(self, token: "CounterToken", count: int):
62
65
  super().__init__(token)
63
66
  self._token = token
@@ -65,6 +68,7 @@ class CounterTokenDependency(Dependency):
65
68
 
66
69
  @property
67
70
  def name(self):
71
+ """The (file) name for this dependency, when taken"""
68
72
  return f"{self.target.identifier}.token"
69
73
 
70
74
  def status(self) -> DependencyStatus:
@@ -87,7 +91,7 @@ class TokenFile:
87
91
  try:
88
92
  self.path = path
89
93
  with path.open("rt") as fp:
90
- count, self.uri = [l.strip() for l in fp.readlines()]
94
+ count, self.uri = [line.strip() for line in fp.readlines()]
91
95
  self.count = int(count)
92
96
  except Exception:
93
97
  logging.exception("Error while reading %s", self.path)
@@ -164,7 +168,7 @@ class CounterToken(Token, FileSystemEventHandler):
164
168
  - TIMESTAMP.token contains (1) the number of tokens (2) the job URI
165
169
  """
166
170
 
167
- """Maps paths to instances"""
171
+ """Maps token keys to CounterToken instances"""
168
172
  TOKENS: Dict[str, "CounterToken"] = {}
169
173
 
170
174
  @staticmethod
@@ -183,13 +187,16 @@ class CounterToken(Token, FileSystemEventHandler):
183
187
 
184
188
  @staticmethod
185
189
  def init_registry(registry: LauncherRegistry):
186
- registry.register_token("countertoken", CounterTokenConfiguration)
190
+ registry.register_token(
191
+ "countertoken",
192
+ DictConfig({}, key_type=str, element_type=CounterConfiguration),
193
+ )
187
194
 
188
195
  def __init__(self, name: str, path: Path, count: int, force=True):
189
196
  """[summary]
190
197
 
191
198
  Arguments:
192
- path {Path} -- The file path of the token file
199
+ path {Path} -- The file path of the token directory
193
200
  count {int} -- Number of tokens (overrides previous definitions)
194
201
  force -- If the token has already been created, force to write the maximum
195
202
  number of tokens
@@ -294,6 +301,9 @@ class CounterToken(Token, FileSystemEventHandler):
294
301
  tokenfile = TokenFile(path)
295
302
  tokenfile.watch()
296
303
  self.cache[path.name] = tokenfile
304
+ except FileNotFoundError:
305
+ # We did not find the token file... just ignore
306
+ pass
297
307
  except Exception:
298
308
  logger.exception("Uncaught exception in on_modified handler")
299
309
  raise
@@ -332,13 +342,18 @@ class CounterToken(Token, FileSystemEventHandler):
332
342
  for dependency in dependents:
333
343
  dependency.check()
334
344
 
345
+ # A modified dependency not in cache
335
346
  elif path.name.endswith(".token") and path.name not in self.cache:
336
347
  with self.lock:
337
348
  if path.name not in self.cache:
338
349
  logger.debug("Token file not in cache %s", path.name)
339
- tokenfile = TokenFile(path)
340
- tokenfile.watch()
341
- self.cache[path.name] = tokenfile
350
+ try:
351
+ tokenfile = TokenFile(path)
352
+ tokenfile.watch()
353
+ self.cache[path.name] = tokenfile
354
+ except FileNotFoundError:
355
+ # Well, the file did not exist anymore...
356
+ pass
342
357
  except Exception:
343
358
  logger.exception("Uncaught exception in on_modified handler")
344
359
  raise
@@ -456,7 +471,3 @@ class CounterConfiguration(TokenConfiguration):
456
471
  from experimaestro.connectors.local import LocalConnector
457
472
 
458
473
  return LocalConnector.instance().createtoken(identifier, self.tokens)
459
-
460
-
461
- class CounterTokenConfiguration(YAMLDict[CounterConfiguration]):
462
- pass
@@ -1,7 +1,9 @@
1
+ import importlib
1
2
  from itertools import chain
2
3
  from typing import Dict, Any
3
4
  from pathlib import Path
4
5
  import json
6
+ from src.experimaestro.core.objects.config_utils import getqualattr
5
7
  from termcolor import colored
6
8
 
7
9
 
@@ -42,6 +44,11 @@ def build_value(data, store: Store):
42
44
  elif t == "path.serialized":
43
45
  # Again, do not return anything (won't change the identifier)
44
46
  return None
47
+ elif t == "enum":
48
+ module = importlib.import_module(data["module"])
49
+ enumClass = getqualattr(module, data["enum"])
50
+ return enumClass[data["value"]]
51
+
45
52
  elif t is None:
46
53
  return {key: build_value(value, store) for key, value in data.items()}
47
54
  assert False, f"Data type {t} not handled"
@@ -71,7 +78,7 @@ def load(path: Path):
71
78
 
72
79
 
73
80
  def print_diff(path: str, conf1: Any, conf2: Any):
74
- if type(conf1) != type(conf2):
81
+ if type(conf1) is not type(conf2):
75
82
  print(f"[{colored(path, 'red')}] {conf1} and {conf2} of different types")
76
83
 
77
84
  if isinstance(conf1, ObjectProxy) and isinstance(conf2, ObjectProxy):
@@ -6,16 +6,18 @@ if sys.version_info.major == 3:
6
6
  if sys.version_info.minor < 11:
7
7
  from typing import _collect_type_vars as _collect_parameters
8
8
  else:
9
- from typing import _collect_parameters
10
-
11
- if sys.version_info.minor < 9:
12
- from typing_extensions import (
13
- _AnnotatedAlias as AnnotatedAlias,
14
- get_args,
15
- get_origin,
16
- )
17
- else:
18
- from typing import _AnnotatedAlias as AnnotatedAlias, get_args, get_origin
9
+
10
+ def _collect_parameters(bases):
11
+ """Collect type parameters from generic bases"""
12
+ parameters = []
13
+ for base in bases:
14
+ if hasattr(base, "__parameters__"):
15
+ parameters.extend(base.__parameters__)
16
+ return tuple(parameters)
17
+
18
+ # from typing import _collect_parameters
19
+
20
+ from typing import _AnnotatedAlias as AnnotatedAlias, get_args, get_origin
19
21
 
20
22
  GenericAlias = typing._GenericAlias
21
23
 
@@ -26,6 +28,13 @@ def isgenericalias(typehint):
26
28
  return isinstance(typehint, GenericAlias)
27
29
 
28
30
 
31
+ def get_union(typehint):
32
+ """Return the list of types of a union (or the type itself if it is not an union)"""
33
+ if isgenericalias(typehint) and typehint.__origin__ == typing.Union:
34
+ return typehint.__args__
35
+ return None
36
+
37
+
29
38
  def get_optional(typehint):
30
39
  if isgenericalias(typehint) and typehint.__origin__ == typing.Union:
31
40
  if len(typehint.__args__) == 2:
@@ -62,7 +71,7 @@ def get_type(typehint):
62
71
  while True:
63
72
  if t := get_optional(typehint):
64
73
  typehint = t
65
- if isinstance(typehint, AnnotatedAlias):
74
+ if is_annotated(typehint):
66
75
  typehint = get_args(typehint)[0]
67
76
  else:
68
77
  break
@@ -10,8 +10,12 @@ def asyncThreadcheck(name, func, *args, **kwargs) -> asyncio.Future:
10
10
 
11
11
  def dowait():
12
12
  logging.debug("Running %s", func)
13
- result = func(*args, **kwargs)
14
- logging.debug("Got result from %s", func)
13
+ try:
14
+ result = func(*args, **kwargs)
15
+ logging.debug("Got result from %s", func)
16
+ except Exception:
17
+ logging.exception("Got an error in the thread")
18
+ raise
15
19
  loop.call_soon_threadsafe(future.set_result, result)
16
20
 
17
21
  # Start thread
@@ -0,0 +1,44 @@
1
+ import logging
2
+ import multiprocessing as mp
3
+ import time
4
+ import os
5
+ import signal
6
+ import threading
7
+
8
+
9
+ def delayed_shutdown(delay=60, *, exit_code=1, grace_period=5):
10
+ """After *delay*'s try a graceful stop, then SIGKILL anything left.
11
+
12
+ :param delay: Delay in seconds before killing
13
+ :param grace_period: Delay in seconds before force-killing a child process
14
+ :param exit_code: The exit code to use
15
+ """
16
+
17
+ def _killer():
18
+ time.sleep(delay)
19
+
20
+ logging.info("Stall dectected – killing all subprocesses")
21
+
22
+ # 1️⃣ Try graceful termination
23
+ for p in mp.active_children():
24
+ # sends SIGTERM / TerminateProcess
25
+ p.terminate()
26
+
27
+ alive = mp.active_children()
28
+ deadline = time.time() + grace_period
29
+ while alive and time.time() < deadline:
30
+ alive = [p for p in alive if p.is_alive()]
31
+ time.sleep(0.1)
32
+
33
+ # 2️⃣ Anything still alive? Nuke it.
34
+ for p in alive:
35
+ try:
36
+ os.kill(p.pid, signal.SIGKILL)
37
+ except OSError:
38
+ pass
39
+
40
+ # 3️⃣ Finally kill the parent
41
+ os.kill(os.getpid(), signal.SIGKILL)
42
+
43
+ # Start the thread (non blocking)
44
+ threading.Thread(target=_killer, daemon=True).start()
@@ -1,11 +1,12 @@
1
1
  from contextlib import contextmanager
2
+ from os import PathLike
2
3
  from pathlib import Path
3
4
  from typing import Union
4
5
  from importlib import resources
5
6
  from experimaestro.compat import cached_property
6
7
 
7
8
 
8
- class ResourcePathWrapper:
9
+ class ResourcePathWrapper(PathLike):
9
10
  """Simple wrapper for resource path"""
10
11
 
11
12
  def __init__(self, path: Path):
@@ -23,12 +24,19 @@ class ResourcePathWrapper:
23
24
  parents = [s.name for s in reversed(self.path.parents)][1:]
24
25
  return ".".join(parents)
25
26
 
26
- @property
27
+ @cached_property
27
28
  def name(self):
28
29
  return self.path.name
29
30
 
30
31
  def is_file(self):
31
- return resources.is_resource(self.package, self.name)
32
+ return any(
33
+ traversable.name == self.name and traversable.is_file()
34
+ for traversable in resources.files(self.package).iterdir()
35
+ )
36
+
37
+ def __fspath__(self):
38
+ """Return the file system path representation of the object"""
39
+ return resources.as_file(resources.files(self.package) / self.name)
32
40
 
33
41
  @contextmanager
34
42
  def open(self, *args, **kwargs):
@@ -1,54 +1,46 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: experimaestro
3
- Version: 1.5.1
3
+ Version: 2.0.0a8
4
4
  Summary: "Experimaestro is a computer science experiment manager"
5
- Home-page: https://github.com/experimaestro/experimaestro-python
6
5
  License: GPL-3
6
+ License-File: LICENSE
7
7
  Keywords: experiment manager
8
8
  Author: Benjamin Piwowarski
9
9
  Author-email: benjamin@piwowarski.fr
10
- Requires-Python: >=3.8,<4.0
10
+ Requires-Python: >=3.10
11
11
  Classifier: Development Status :: 4 - Beta
12
12
  Classifier: Intended Audience :: Science/Research
13
13
  Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
14
- Classifier: License :: Other/Proprietary License
15
14
  Classifier: Operating System :: OS Independent
16
15
  Classifier: Programming Language :: Python
17
16
  Classifier: Programming Language :: Python :: 3
18
- Classifier: Programming Language :: Python :: 3.8
19
- Classifier: Programming Language :: Python :: 3.9
20
- Classifier: Programming Language :: Python :: 3.10
21
- Classifier: Programming Language :: Python :: 3.11
22
- Classifier: Programming Language :: Python :: 3.12
23
17
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
24
18
  Requires-Dist: arpeggio (>=2,<3)
25
- Requires-Dist: attrs (>=23.1.0,<24.0.0)
19
+ Requires-Dist: attrs (>=23.1.0,<24)
26
20
  Requires-Dist: click (>=8)
27
21
  Requires-Dist: decorator (>=5,<6)
28
- Requires-Dist: docstring-parser (>=0.15,<0.16)
29
- Requires-Dist: fabric (>=3,<4)
30
- Requires-Dist: fasteners (>=0.19,<0.20)
31
- Requires-Dist: flask (>=2.3,<3.0)
32
- Requires-Dist: flask-socketio (>=5.3,<6.0)
33
- Requires-Dist: gevent (>=23.9,<24.0)
34
- Requires-Dist: gevent-websocket (>=0.10,<0.11)
22
+ Requires-Dist: docstring-parser (>=0.15,<1)
23
+ Requires-Dist: fasteners (>=0.19,<1)
24
+ Requires-Dist: flask (>=2.3,<3)
25
+ Requires-Dist: flask-socketio (>=5.3,<6)
26
+ Requires-Dist: gevent (>=25)
27
+ Requires-Dist: gevent-websocket (>=0.10)
35
28
  Requires-Dist: huggingface-hub (>0.17)
36
- Requires-Dist: humanfriendly (>=10,<11)
37
- Requires-Dist: marshmallow (>=3.20,<4.0)
38
- Requires-Dist: omegaconf (>=2.3,<3.0)
39
- Requires-Dist: psutil (>=5.9.5,<6.0.0)
40
- Requires-Dist: pyparsing (>=3.1,<4.0)
41
- Requires-Dist: pytools (>=2023.1.1,<2024.0.0)
42
- Requires-Dist: pyyaml (>=6.0.1,<7.0.0)
43
- Requires-Dist: requests (>=2.31,<3.0)
44
- Requires-Dist: rpyc (>=5,<6)
45
- Requires-Dist: sortedcontainers (>=2.4,<3.0)
46
- Requires-Dist: termcolor (>=2.3)
47
- Requires-Dist: tqdm (>=4.66.1,<5.0.0)
29
+ Requires-Dist: humanfriendly (>=10)
30
+ Requires-Dist: marshmallow (>=3.20,<4)
31
+ Requires-Dist: mkdocs (>=1.5,<2)
32
+ Requires-Dist: omegaconf (>=2.3,<3)
33
+ Requires-Dist: psutil (>=7,<8)
34
+ Requires-Dist: pyparsing (>=3.1,<4)
35
+ Requires-Dist: pytools (>=2023.1.1,<2024)
36
+ Requires-Dist: pyyaml (>=6.0.1,<7)
37
+ Requires-Dist: requests (>=2.31,<3)
38
+ Requires-Dist: rpyc (>=5,<7)
39
+ Requires-Dist: sortedcontainers (>=2.4,<3)
40
+ Requires-Dist: termcolor (>=2.3,<3)
41
+ Requires-Dist: tqdm (>=4.66.1,<5)
48
42
  Requires-Dist: typing-extensions (>=4.2) ; python_version < "3.12"
49
- Requires-Dist: watchdog (>=2,<3)
50
- Project-URL: Documentation, https://experimaestro-python.readthedocs.io/
51
- Project-URL: Repository, https://github.com/experimaestro/experimaestro-python
43
+ Requires-Dist: watchdog (>=2)
52
44
  Description-Content-Type: text/markdown
53
45
 
54
46
  [![PyPI version](https://badge.fury.io/py/experimaestro.svg)](https://badge.fury.io/py/experimaestro)
@@ -146,11 +138,11 @@ def cli(port, workdir, sleeptime):
146
138
  # Sets the working directory and the name of the xp
147
139
  with experiment(workdir, "helloworld", port=port) as xp:
148
140
  # Submit the tasks
149
- hello = Say(word="hello", sleeptime=sleeptime).submit()
150
- world = Say(word="world", sleeptime=sleeptime).submit()
141
+ hello = Say.C(word="hello", sleeptime=sleeptime).submit()
142
+ world = Say.C(word="world", sleeptime=sleeptime).submit()
151
143
 
152
144
  # Concat will depend on the two first tasks
153
- Concat(strings=[hello, world], sleeptime=sleeptime).tag("y", 1).submit()
145
+ Concat.C(strings=[hello, world], sleeptime=sleeptime).tag("y", 1).submit()
154
146
 
155
147
 
156
148
  if __name__ == "__main__":
@@ -0,0 +1,166 @@
1
+ experimaestro/__init__.py,sha256=XCSuw7ozZZxL9ugnkIhqAaG7CQ6dE9NeSiDJ93QFH_I,1649
2
+ experimaestro/__main__.py,sha256=Dv9lFl03yt1dswd0Xb9NIJRgHpA5_IwH4RfQPEHyFz0,158
3
+ experimaestro/annotations.py,sha256=1QhKA247w50KmhsxvFBnDe6BRc7_EIMMq0GT7LIaGv8,8774
4
+ experimaestro/checkers.py,sha256=ZCMbnE_GFC5compWjt-fuHhPImi9fCPjImF8Ow9NqK8,696
5
+ experimaestro/cli/__init__.py,sha256=bJ7lMdR45bTd-W-kw7CJicR-0qXwNzqUZ_EYfaHH3Oc,9537
6
+ experimaestro/cli/filter.py,sha256=bINAF-O7CwJ2u3T6xG_Q_niqDbPeoEASyYLuCeNlbFw,6313
7
+ experimaestro/cli/jobs.py,sha256=BnejUnhKAgMBVgwANfQYj5mLzknXVohveg7NpovNZ8o,7925
8
+ experimaestro/cli/progress.py,sha256=I6qhVe-vvqA1ym6XJE75q7Hb0jGeFwgodIqfhlTrPKY,8200
9
+ experimaestro/click.py,sha256=6BkeQHEgcxaxzq3xEvEEzwzuBj5-dkfrpOGikuA8L00,1377
10
+ experimaestro/commandline.py,sha256=MJIJcfppGCjNA8ozxXUzbUSeDOlTExuzhxryGx3_lIo,9314
11
+ experimaestro/compat.py,sha256=dQqE2ZNHLM2wtdfp7fBRYMfC33qNehVf9J6FGRBUQhs,171
12
+ experimaestro/connectors/__init__.py,sha256=_8jETUTM3Ecdm8azNrxCSCXyXWso0mwDFnTrcNV3a4w,6129
13
+ experimaestro/connectors/local.py,sha256=lCGIubqmUJZ1glLtLRXOgakTMfEaEmFtNkEcw9qV5vw,6143
14
+ experimaestro/connectors/ssh.py,sha256=5giqvv1y0QQKF-GI0IFUzI_Z5H8Bj9EuL_Szpvk899Q,8600
15
+ experimaestro/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
+ experimaestro/core/arguments.py,sha256=gB0Kq9XL0_mYbm9WHL-mDx2tUGHI1pvsu1ahMaDxIY0,7170
17
+ experimaestro/core/callbacks.py,sha256=59JfeUgWcCCdIQ3pvh-xNnoRp9BX8f4iOAkgm16wBzE,1660
18
+ experimaestro/core/context.py,sha256=1tLmX7WcgEKSbGw77vfziTzS8KNsoZJ02JBWMBCqqOk,2606
19
+ experimaestro/core/identifier.py,sha256=GmS3HtfLwirjoaVx6cZvLJL4r4546P0FFUSu2Nt0W9g,10812
20
+ experimaestro/core/objects/__init__.py,sha256=ucJY5e17QQ1Kc-GYXeL7g8GFj8rP0XB4g2vrl32uhxY,721
21
+ experimaestro/core/objects/config.py,sha256=D6puZs3VH9GapoHhtgNawwjfQUxSH4E5v3V3sdwLZbg,53575
22
+ experimaestro/core/objects/config_utils.py,sha256=ZLECGkeIWdzunm8vwWsQhvcSgV1e064BgXbLiZnxSEM,1288
23
+ experimaestro/core/objects/config_walk.py,sha256=SYBrGuT7HV12no9mQd1HjnebiyygHyO-zq_TO1brUtc,4233
24
+ experimaestro/core/objects.pyi,sha256=Q1tq4F8LrExPm00E-P5aaygxMvViYZqhHvByo_TTZRE,6315
25
+ experimaestro/core/serialization.py,sha256=CSPEwOzlDsgAz6V2og-TgyU0RXDtzt_nXaoXFZleDZE,5775
26
+ experimaestro/core/serializers.py,sha256=iOBuASEgD8dRKPnL16iOLBsM0GHChCJgjBd7LixFui4,919
27
+ experimaestro/core/types.py,sha256=aI-Qad27tkBFR5HyBCeeUwmZFIQif70__AR7enzpjvY,20938
28
+ experimaestro/core/utils.py,sha256=JfC3qGUS9b6FUHc2VxIYUI9ysNpXSQ1LjOBkjfZ8n7o,495
29
+ experimaestro/exceptions.py,sha256=cUy83WHM3GeynxmMk6QRr5xsnpqUAdAoc-m3KQVrE2o,44
30
+ experimaestro/experiments/__init__.py,sha256=GcpDUIbCvhnv6rxFdAp4wTffCVNTv-InY6fbQAlTy-o,159
31
+ experimaestro/experiments/cli.py,sha256=2HCSl4nO8XxNcqXFnl34nJ-6HVsu-pNELPJyUKK0JLc,10122
32
+ experimaestro/experiments/configuration.py,sha256=vVm40BJW5sZNgSDZ0oBzX15jTO9rmOewVYrm0k9iXXY,1466
33
+ experimaestro/generators.py,sha256=DQsEgdMwRUud9suWr-QGxI3vCO5sywP6MVGZWRNQXkk,1372
34
+ experimaestro/huggingface.py,sha256=gnVlr6SZnbutYz4PLH0Q77n1TRF-uk-dR-3UFzFqAY0,2956
35
+ experimaestro/ipc.py,sha256=Xn3tYME83jLEB0nFak3DwEIhpL5IRZpCl3jirBF_jl4,1570
36
+ experimaestro/launcherfinder/__init__.py,sha256=qRUDyv3B9UsAM8Q31mRrZrTZox0AptwdmOY4f2K-TUo,279
37
+ experimaestro/launcherfinder/base.py,sha256=q47SsF_cXdo5O6ZhFKn5385WVFcx8Wd-BcEpd6tRpbs,515
38
+ experimaestro/launcherfinder/parser.py,sha256=MIHhjs2sTVxLHLcc1CgFid9XxhInXker8QdA-GBA-Bk,2364
39
+ experimaestro/launcherfinder/registry.py,sha256=qP2Y9mfxn7XvIBr4ot2zkyKw6sWhmgBxDDKU5Ty04FE,6417
40
+ experimaestro/launcherfinder/specs.py,sha256=eQC2pwAnvq7kF2xmAfHpg_Wx6_lH6YMf3ZCDwqatjKk,7898
41
+ experimaestro/launchers/__init__.py,sha256=lXn544sgJExr6uirILWzAXu_IfmfyqFZOt4OzRnjHXg,2525
42
+ experimaestro/launchers/direct.py,sha256=JZh6WOPnO6ED_xlOs8pL4MRFmnRhmXzpVxTl-ByaD2A,258
43
+ experimaestro/launchers/oar.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
+ experimaestro/launchers/slurm/__init__.py,sha256=R1Zwd4phZaXV8FwCYhzfB44n0V4cf-hBQzOc6NkFQ0s,41
45
+ experimaestro/launchers/slurm/base.py,sha256=2CPNJeTNuwPOjqgmdkZ3MfdZbKQTIwlJtu_JL-IClg8,15753
46
+ experimaestro/locking.py,sha256=hPT-LuDGZTijpbme8O0kEoB9a3WjdVzI2h31OT44UxE,1477
47
+ experimaestro/mkdocs/__init__.py,sha256=L9UDM7vOrRZl41zXTBOaHKSINEEsbmxwjIMIGESmLfU,46
48
+ experimaestro/mkdocs/annotations.py,sha256=qpDw8lzrxpsOShXcpcP_LAeR3UhiIXAybG8UvS64-OU,263
49
+ experimaestro/mkdocs/base.py,sha256=qHDZZFdoNRsW6RcjRB1WCSp2sOtRiBk9zFO1acK05BQ,16706
50
+ experimaestro/mkdocs/metaloader.py,sha256=qCqnTWhlgxql-oe46E8AbvYdoM311-lQh-msmPnbllQ,1481
51
+ experimaestro/mkdocs/style.css,sha256=42kJ6Ozq_n4Iw5UfJ4-nO1u-HN3ELvV7Vhvj1Xkn7rQ,66
52
+ experimaestro/mypy.py,sha256=M39VFuDrab-ymlCDIF5jys9oKpTwnuBPzb1T8Un5J3s,285
53
+ experimaestro/notifications.py,sha256=30jPhTo8eU1Nd8RRYorswdlXZ99EuGs38Acg-6l9MyM,9643
54
+ experimaestro/progress.py,sha256=ABdgjCxdVreo6e--Pm1WgIjOWkmggloW2dJU-P5hCfk,14856
55
+ experimaestro/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
56
+ experimaestro/rpyc.py,sha256=ZRKol-3tVoeoUITLNFenLF4dhWBLW_FvSV_GvsypmeI,3605
57
+ experimaestro/run.py,sha256=_szMzKn-67ulT6Wy21dzhB1g6_fiL379JnBC0zJqpIY,5332
58
+ experimaestro/scheduler/__init__.py,sha256=HssbogPCuGpKGMPZQP07XCT2-uMFRPANuPM-duMIrq4,422
59
+ experimaestro/scheduler/base.py,sha256=Wq5hfryOvBrvGDpOgitdVQ2TkNYgrt-hHCU8Yey6J6M,10316
60
+ experimaestro/scheduler/dependencies.py,sha256=n9XegwrmjayOIxt3xhuTEBVEBGSq4oeVdzz-FviDGXo,1994
61
+ experimaestro/scheduler/dynamic_outputs.py,sha256=yYPL98I0nSgDjlE3Sk9dtvovh2PZ6rUDnKjDNnAg1dc,5732
62
+ experimaestro/scheduler/experiment.py,sha256=gO0S66AE8jDv_huaezra3odFqjNnuLLVmZVv-sorJ1A,13297
63
+ experimaestro/scheduler/jobs.py,sha256=tJFndvHW5-Padfw-KfU_ytO7l3xaXpjhqEOy9g7gFDs,15279
64
+ experimaestro/scheduler/services.py,sha256=aCKkNZMULlceabqf-kOs_-C7KPINnjU3Q-I00o5x6iY,2189
65
+ experimaestro/scheduler/signal_handler.py,sha256=B4ZeSVB8O41VDdFmV4n2cyBds7wKFG3kH2Fp7cpyxa4,872
66
+ experimaestro/scheduler/state.py,sha256=1ICn1K5gNMCEUb85vwwXLIUF6Lxqa5mbTgMzEz2pnXw,2367
67
+ experimaestro/scheduler/workspace.py,sha256=KNdxPBwUk7gO8h2utMCrlIVKB-f2Ylqg_IxLc4okp_8,2320
68
+ experimaestro/scriptbuilder.py,sha256=6GKUkgixLqSEy41sNr-_HNcrjKb8uxaoQ65DywRYsC0,5027
69
+ experimaestro/server/__init__.py,sha256=V1NbTS7ByqI29t6ArGn5GJeDWQ9VYGQ81qCwFbpLGso,11810
70
+ experimaestro/server/data/0c35d18bf06992036b69.woff2,sha256=gmX2R4Y5fWuDLRygqv3xSa2E5ydZ__qfcnLpGg-wFdE,128352
71
+ experimaestro/server/data/1815e00441357e01619e.ttf,sha256=gIRDrmyCBDla3YVD2oqQpguTdvsPh-2OjqN9EJWW2AU,210792
72
+ experimaestro/server/data/219aa9140e099e6c72ed.woff2,sha256=0xv7gdVueQ4Nni-gC4Pfj3FZ-QYxFM3AFIWbHUg5Vsg,135984
73
+ experimaestro/server/data/2463b90d9a316e4e5294.woff2,sha256=qnWZhiOjkeYcaQF5Ss6DLj7N0oi1bWCPIb6gQRrMC44,158220
74
+ experimaestro/server/data/2582b0e4bcf85eceead0.ttf,sha256=0vBZNUCw4zum3iVaVPJy1GbjEUSAaVa-qM_b9-3_yb0,426112
75
+ experimaestro/server/data/3a4004a46a653d4b2166.woff,sha256=-jiI7_pbxjPGuygaSdiSf-eqACEsn8D3M4yBnsXMFu4,156236
76
+ experimaestro/server/data/3baa5b8f3469222b822d.woff,sha256=PTTzCsa7Ivpb9Y0-Uue7bezZnFcdanfV36e-eL7PK1A,339600
77
+ experimaestro/server/data/4d73cb90e394b34b7670.woff,sha256=_YT4i0lwQNT31ejJ-GNa740-cGwPpS4rb6zxTu6H5SI,164912
78
+ experimaestro/server/data/4ef4218c522f1eb6b5b1.woff2,sha256=Hmc7qFiWVHlNKtN1woc_GHCkV48rPoR9zEB63QO1esI,215704
79
+ experimaestro/server/data/5d681e2edae8c60630db.woff,sha256=HBNbFRpB4jE4sy0wZePw6rIwpnrv6SXplwnL4QK9YEw,206260
80
+ experimaestro/server/data/6f420cf17cc0d7676fad.woff2,sha256=NdyopxRaF8jRMG8lo8oJFXjhU5bwsi1h645zJirHVXc,155276
81
+ experimaestro/server/data/89999bdf5d835c012025.woff2,sha256=40VtEoO511M3p3Pf0Ue_kI_QLAG0v0hXbYYDppsTy-U,25472
82
+ experimaestro/server/data/914997e1bdfc990d0897.ttf,sha256=VM9ghve7IfnQcq1JShm0aB-lFt0KFM7lLaAdNlGpE6M,68064
83
+ experimaestro/server/data/c210719e60948b211a12.woff2,sha256=1yNqGb8jy7ICcoDo9R3JnWxFl2ou1g3nM4KwNLGKK2g,118684
84
+ experimaestro/server/data/c380809fd3677d7d6903.woff2,sha256=yUjxJjNBaZs8HpxV2NDz5EZmnQ8rnVVJTGFpIiwCQ6Y,173620
85
+ experimaestro/server/data/f882956fd323fd322f31.woff,sha256=jpR1jFTCboWqzy09yhrXqtpZBKRgI4-uSEPrxEvELtw,182028
86
+ experimaestro/server/data/favicon.ico,sha256=PRD32mxgMXg0AIFmjErFs66XQ8qaJiqw_NMS-7n0i90,3870
87
+ experimaestro/server/data/index.css,sha256=hujPctk1MO9fdUpzFiveEKQzkiABNGmeJOtNoUMqDAY,392757
88
+ experimaestro/server/data/index.css.map,sha256=rKkhyfo3OaALku4FrL0Lqs8-mjxfXlkvPIk5V-LfaBs,575718
89
+ experimaestro/server/data/index.html,sha256=LcXSo2QU5jcmqgmFhVWWOG_CfGyrqdm3H8jwkdRgdGU,706
90
+ experimaestro/server/data/index.js,sha256=q8oG4RM5rRjIGmI1szIrLTxigTHNkVUG1BuHbcjUeSw,3710972
91
+ experimaestro/server/data/index.js.map,sha256=cv7KF28Uq5dy7Ux3yRnoSVztrOFVid359fm0Xn2IJ6s,3903046
92
+ experimaestro/server/data/login.html,sha256=4dvhSOn6DHp_tbmzqIKrqq2uAo0sAUbgLVD0lTnPp4s,511
93
+ experimaestro/server/data/manifest.json,sha256=EpzHQZzrGh9c1Kf63nrqvI33H1cm0nLYfdh5lDm8ijI,318
94
+ experimaestro/settings.py,sha256=j6iVV8bFn5VP-TopjtbSyX1wNgmfs3jzGeeAmaZzOPA,3172
95
+ experimaestro/sphinx/__init__.py,sha256=HAofa65lCLAUOShgWwJIGEEOPKzu4VEs5LZd46V_Bng,9466
96
+ experimaestro/sphinx/static/experimaestro.css,sha256=0rEgt1LoDdD-a_R5rVfWZ19zD1gR-1L7q3f4UibIB58,294
97
+ experimaestro/taskglobals.py,sha256=Lp0bqobVLndR7fOtF9qPI7utTKQXXwTdVN6l5Av9Dc4,660
98
+ experimaestro/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
99
+ experimaestro/tests/conftest.py,sha256=CtC6TvUS9sbgSc3pZYyTyEvfilnNGPpOUJvi-jn6twI,695
100
+ experimaestro/tests/connectors/bin/executable.py,sha256=RmCrH_MQiHuPRyeTP2jut0ASpfvHEH1QCxRnlvDZW2s,21
101
+ experimaestro/tests/connectors/test_local.py,sha256=hMX3maYYRABGXqRZFZbTWjf-jcvPkBq9nReLtDwLydk,1204
102
+ experimaestro/tests/connectors/utils.py,sha256=9sM3Pwy2nRfSr7pwQoOoSCDhBrEcDsEElI08Fmrw_gU,702
103
+ experimaestro/tests/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
104
+ experimaestro/tests/core/test_generics.py,sha256=QfO25aSV6kKKlGGSvPK19pSOI86FhXKEy3iFQbspIzE,5185
105
+ experimaestro/tests/definitions_types.py,sha256=nMoQxZxhTJAYV87Ce9F2dAITxXGHf7Uw5j-MKsZ3LmQ,399
106
+ experimaestro/tests/launchers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
107
+ experimaestro/tests/launchers/bin/sacct,sha256=9mmRAYCE4RBSBOf7aanhFw9hzujOUlcw3OJmZJ3K-Wc,639
108
+ experimaestro/tests/launchers/bin/sbatch,sha256=KgG4xUiIpELHBWLjnM7IUBu5jKiIGnILS9HfHE5eVFk,1715
109
+ experimaestro/tests/launchers/bin/srun,sha256=3oE3qq0UFpVtTvXfR1kH3tovFYX74fp1Fk-o8zgsaJA,47
110
+ experimaestro/tests/launchers/bin/test.py,sha256=MbxdAd2Sf7T-Hj3ldmrtngbQuBdNOkXjMcICJTf39wI,477
111
+ experimaestro/tests/launchers/common.py,sha256=WqVcWX3g0XYJS0aJO7XWVvOmncRBbQmGvuNxH9AHUAE,2998
112
+ experimaestro/tests/launchers/config_slurm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
113
+ experimaestro/tests/launchers/config_slurm/launchers.py,sha256=DohwQVv1eXWfDpAYFg7KJekEm7q7G-lMou2lPg-PKOk,838
114
+ experimaestro/tests/launchers/test_local.py,sha256=4oGgWH2YgkEm-Muu6s4cwlgriXtYr5xAd72DVoIw_Yk,717
115
+ experimaestro/tests/launchers/test_slurm.py,sha256=5s-mMtqvE62xJ_GijLd4Hmsu3vWCRCbFy7cPce8YKsM,2534
116
+ experimaestro/tests/restart.py,sha256=aAizVLvw2DaNfIzuRB13iYXOoX1Q5NkgsngumERlo2s,4191
117
+ experimaestro/tests/restart_main.py,sha256=iAFzw0H1q9Aq7t6TrSAj236QBnYU52qx0VF-2dz6tx4,295
118
+ experimaestro/tests/scripts/notifyandwait.py,sha256=3BLXLI5XgP3BnKf6sQ56oKoMVqR80VMHmploJ3JO6Ko,407
119
+ experimaestro/tests/scripts/waitforfile.py,sha256=EDT-TuFi2fU_qt51K5EmAxjw_OnJKkBW7UCfhrtDbVw,120
120
+ experimaestro/tests/task_tokens.py,sha256=vgqUa-S_YC2Id9pGOSv40qFTwq1WGZkFhr556Z5o678,477
121
+ experimaestro/tests/tasks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
122
+ experimaestro/tests/tasks/all.py,sha256=2KF0D1CB2PBwM_aXX09Ug6vy0MUQgoTATdheNeNKXHg,2101
123
+ experimaestro/tests/tasks/foreign.py,sha256=uhXDOcWozkcm26ybbeEU9RElJpbhjC-zdzmlSKfPcdY,122
124
+ experimaestro/tests/test_checkers.py,sha256=e6Rv2TlePRY__VXs0vUb6a5Aw_KIq_cs4N86VhnYHtw,407
125
+ experimaestro/tests/test_dependencies.py,sha256=LvpmMcfnRzQPzUIuFNCIQnJot8YBSxCA827xh9gYlq0,1890
126
+ experimaestro/tests/test_experiment.py,sha256=Nfevu_aMyX4c5xTjDHMeKXZWs2HMOhy96tsQlnF-IVs,1693
127
+ experimaestro/tests/test_file_progress.py,sha256=uNUUq-ptcnxu56zRvUUZ5EYM9ZIQbUmOU_LI0roMgSw,15119
128
+ experimaestro/tests/test_file_progress_integration.py,sha256=ejXASpdnpi6HUy569Q5Vx5F8SV_RDU-4o3yuQka6vS4,16751
129
+ experimaestro/tests/test_findlauncher.py,sha256=KPy8ow--NXS1KFCIpxrmEJFRvjo-v-PwlVHVyoVKLPg,3134
130
+ experimaestro/tests/test_forward.py,sha256=9y1zYm7hT_Lx5citxnK7n20cMZ2WJbsaEeY5irCZ9U4,735
131
+ experimaestro/tests/test_generators.py,sha256=R0UypTzxX0dPYvY4A_kozpLDHhGzQDNfLQyc0oRaSx8,2891
132
+ experimaestro/tests/test_identifier.py,sha256=0uv7lsgLLzKHLinlq2J9yj9UyKG6ud1EYtxIyeXbyhE,14368
133
+ experimaestro/tests/test_instance.py,sha256=VFRvjy1OXGtGgkh__mf73KmJq4Lom7ppvBDkhE7rjTA,1325
134
+ experimaestro/tests/test_objects.py,sha256=hGku35h1qkNMIdgP_gWM7HeviaqW7jrZDffOsCJh-_Q,1787
135
+ experimaestro/tests/test_outputs.py,sha256=vilnECNfc-cyzDZjTvCgCSMesC7QwWTfhJtlOyM9kIM,797
136
+ experimaestro/tests/test_param.py,sha256=OW3uguPjy9U6f9BrLr8z4ieo88EH6da2zMho-FVwmKQ,7324
137
+ experimaestro/tests/test_progress.py,sha256=j-V65Adk9psBzMcSzlH7uSqDiLkYDd3Udpy1UCT8j2Y,7588
138
+ experimaestro/tests/test_serializers.py,sha256=dQkiuvHAQ1g-SCRCfOy977nQMWR7CFuBUud65N_vfiI,1248
139
+ experimaestro/tests/test_snippets.py,sha256=rojnyDjtmAMnSuDUj6Bv9XEgdP8oQf2nVc132JF8vsM,3081
140
+ experimaestro/tests/test_ssh.py,sha256=KS1NWltiXrJBSStY9d4mwrexeqgNGWmhxuAU_WLQDAU,1449
141
+ experimaestro/tests/test_tags.py,sha256=_FE0g1kCwrgy7AlLNmgYHol07lMk8Iyera60-gO2k-s,2886
142
+ experimaestro/tests/test_tasks.py,sha256=Lbo9hc3FGah8XTsMFQVfFFp4YqE3FtHNCrEuz43ZHOs,9016
143
+ experimaestro/tests/test_tokens.py,sha256=0PPVCBcYWzFqgCQEbJsNAZOIVZt4VVv2vu-W4sk0Ogg,7859
144
+ experimaestro/tests/test_types.py,sha256=Y76TvSv9euJqI6Zu14cnD8ldToWxts43yvGa7-HV2kA,1363
145
+ experimaestro/tests/test_validation.py,sha256=tinkXETcAGtgPIsmbioKSU00kGIV1YnniHTGDDcUOq8,4118
146
+ experimaestro/tests/token_reschedule.py,sha256=z7oVrFvRkUlBC3FMTr552ayeCt6DWTpx1j9Dk5YtPq8,1703
147
+ experimaestro/tests/utils.py,sha256=41krZFgUaCxCYBQPmo5dNFDd9W6RU8ZzzyzY3FyutUI,3805
148
+ experimaestro/tokens.py,sha256=ZnsDnfJgyAUgThv0c-ta28CrHre0gRyQF6q5FD9tCLY,15147
149
+ experimaestro/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
150
+ experimaestro/tools/diff.py,sha256=4GWWXgpkotO6a7i6qG64oWPGm8Ej7eFCDNj0wjZ-G7s,3715
151
+ experimaestro/tools/documentation.py,sha256=O2UzjzodPqGot3YSe6NYlK7S42XpplakUdqxFpvjqHQ,9184
152
+ experimaestro/tools/jobs.py,sha256=63bXhJ7RGdczLU_nxu2skGn-9dwgr4r5pD23qH4WeBA,3516
153
+ experimaestro/typingutils.py,sha256=v7wS9xewF3cYOKvaBFxlTB-qplJ8olI1OaO3tAKiwIo,3678
154
+ experimaestro/utils/__init__.py,sha256=BdYguxAbR1jOQPV36OgGA31itaMvBJ6WVPV6b4Jn4xw,2434
155
+ experimaestro/utils/asyncio.py,sha256=9r_vFQs6T6tqmymC_DbHVFhY9YVRO6X48uEuyL_ugP8,726
156
+ experimaestro/utils/jobs.py,sha256=42FAdKcn_v_-M6hcQZPUBr9kbDt1eVsk3a4E8Gc4eu8,2394
157
+ experimaestro/utils/jupyter.py,sha256=JcEo2yQK7x3Cr1tNl5FqGMZOICxCv9DwMvL5xsWdQPk,2183
158
+ experimaestro/utils/multiprocessing.py,sha256=am3DkHP_kmWbpynbck2c9QystCUtPBoSAC0ViBVzndU,1275
159
+ experimaestro/utils/resources.py,sha256=j-nvsTFwmgENMoVGOD2Ap-UD3WU85WkI0IgeSszMCX4,1328
160
+ experimaestro/utils/settings.py,sha256=jpFMqF0DLL4_P1xGal0zVR5cOrdD8O0Y2IOYvnRgN3k,793
161
+ experimaestro/xpmutils.py,sha256=S21eMbDYsHfvmZ1HmKpq5Pz5O-1HnCLYxKbyTBbASyQ,638
162
+ experimaestro-2.0.0a8.dist-info/METADATA,sha256=vZ4UCEkPrs1HE6gA8YUcTeyLyKgRz1-iGg9buRdX4D0,5712
163
+ experimaestro-2.0.0a8.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
164
+ experimaestro-2.0.0a8.dist-info/entry_points.txt,sha256=TppTNiz5qm5xm1fhAcdLKdCLMrlL-eQggtCrCI00D9c,446
165
+ experimaestro-2.0.0a8.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
166
+ experimaestro-2.0.0a8.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 1.9.0
2
+ Generator: poetry-core 2.2.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -5,10 +5,6 @@ experimaestro=experimaestro.__main__:main
5
5
  local=experimaestro.connectors.local:LocalConnector
6
6
  ssh=experimaestro.connectors.ssh:SshConnector
7
7
 
8
- [experimaestro.launchers]
9
- slurm=experimaestro.launchers.slurm:SlurmLauncher
10
- unix=experimaestro.launchers.direct:DirectLauncher
11
-
12
8
  [experimaestro.process]
13
9
  local=experimaestro.connectors.local:LocalProcess
14
10
  slurm=experimaestro.launchers.slurm:BatchSlurmProcess
@@ -1,29 +0,0 @@
1
- import sys
2
- import click
3
-
4
- from .configuration import SlurmConfiguration, fill_nodes_configuration
5
-
6
-
7
- @click.group()
8
- def cli():
9
- pass
10
-
11
-
12
- @click.option("--no-hosts", is_flag=True, help="Disable hosts")
13
- @cli.command()
14
- def convert(no_hosts):
15
- """Convert the ouptut of 'scontrol show node' into a YAML form compatible
16
- with launchers.yaml"""
17
- import yaml
18
- from experimaestro.launcherfinder import LauncherRegistry
19
-
20
- configuration = SlurmConfiguration(id="", partitions={})
21
- fill_nodes_configuration(sys.stdin, configuration)
22
-
23
- if no_hosts:
24
- for pid, partition in configuration.partitions.items():
25
- for node in partition.nodes:
26
- node.hosts = []
27
- configuration.use_hosts = False
28
-
29
- yaml.dump(configuration, sys.stdout, Dumper=LauncherRegistry.instance().Dumper)