experimaestro 1.6.1__py3-none-any.whl → 1.7.0__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 (81) hide show
  1. experimaestro/__init__.py +3 -1
  2. experimaestro/annotations.py +13 -3
  3. experimaestro/cli/filter.py +3 -3
  4. experimaestro/cli/jobs.py +1 -1
  5. experimaestro/commandline.py +3 -7
  6. experimaestro/connectors/__init__.py +22 -10
  7. experimaestro/connectors/local.py +17 -8
  8. experimaestro/connectors/ssh.py +1 -1
  9. experimaestro/core/arguments.py +26 -3
  10. experimaestro/core/objects.py +90 -6
  11. experimaestro/core/objects.pyi +7 -1
  12. experimaestro/core/types.py +33 -2
  13. experimaestro/experiments/cli.py +21 -9
  14. experimaestro/generators.py +6 -1
  15. experimaestro/ipc.py +4 -1
  16. experimaestro/launcherfinder/registry.py +23 -5
  17. experimaestro/launchers/slurm/base.py +47 -9
  18. experimaestro/notifications.py +1 -1
  19. experimaestro/run.py +1 -1
  20. experimaestro/scheduler/base.py +102 -6
  21. experimaestro/scheduler/dynamic_outputs.py +184 -0
  22. experimaestro/scheduler/workspace.py +2 -1
  23. experimaestro/scriptbuilder.py +13 -2
  24. experimaestro/server/data/016b4a6cdced82ab3aa1.ttf +0 -0
  25. experimaestro/server/data/0c35d18bf06992036b69.woff2 +0 -0
  26. experimaestro/server/data/1815e00441357e01619e.ttf +0 -0
  27. experimaestro/server/data/219aa9140e099e6c72ed.woff2 +0 -0
  28. experimaestro/server/data/2463b90d9a316e4e5294.woff2 +0 -0
  29. experimaestro/server/data/2582b0e4bcf85eceead0.ttf +0 -0
  30. experimaestro/server/data/3a4004a46a653d4b2166.woff +0 -0
  31. experimaestro/server/data/3baa5b8f3469222b822d.woff +0 -0
  32. experimaestro/server/data/4d73cb90e394b34b7670.woff +0 -0
  33. experimaestro/server/data/4ef4218c522f1eb6b5b1.woff2 +0 -0
  34. experimaestro/server/data/50701fbb8177c2dde530.ttf +0 -0
  35. experimaestro/server/data/5d681e2edae8c60630db.woff +0 -0
  36. experimaestro/server/data/6f420cf17cc0d7676fad.woff2 +0 -0
  37. experimaestro/server/data/878f31251d960bd6266f.woff2 +0 -0
  38. experimaestro/server/data/89999bdf5d835c012025.woff2 +0 -0
  39. experimaestro/server/data/914997e1bdfc990d0897.ttf +0 -0
  40. experimaestro/server/data/b041b1fa4fe241b23445.woff2 +0 -0
  41. experimaestro/server/data/b6879d41b0852f01ed5b.woff2 +0 -0
  42. experimaestro/server/data/c210719e60948b211a12.woff2 +0 -0
  43. experimaestro/server/data/c380809fd3677d7d6903.woff2 +0 -0
  44. experimaestro/server/data/d75e3fd1eb12e9bd6655.ttf +0 -0
  45. experimaestro/server/data/f882956fd323fd322f31.woff +0 -0
  46. experimaestro/server/data/favicon.ico +0 -0
  47. experimaestro/server/data/index.css +22963 -0
  48. experimaestro/server/data/index.css.map +1 -0
  49. experimaestro/server/data/index.html +27 -0
  50. experimaestro/server/data/index.js +101770 -0
  51. experimaestro/server/data/index.js.map +1 -0
  52. experimaestro/server/data/login.html +22 -0
  53. experimaestro/server/data/manifest.json +15 -0
  54. experimaestro/settings.py +2 -2
  55. experimaestro/sphinx/__init__.py +7 -17
  56. experimaestro/taskglobals.py +7 -2
  57. experimaestro/tests/definitions_types.py +5 -3
  58. experimaestro/tests/launchers/bin/sbatch +34 -7
  59. experimaestro/tests/launchers/bin/srun +5 -0
  60. experimaestro/tests/launchers/common.py +16 -4
  61. experimaestro/tests/restart.py +6 -3
  62. experimaestro/tests/tasks/all.py +16 -10
  63. experimaestro/tests/tasks/foreign.py +2 -4
  64. experimaestro/tests/test_forward.py +5 -5
  65. experimaestro/tests/test_identifier.py +61 -66
  66. experimaestro/tests/test_instance.py +3 -6
  67. experimaestro/tests/test_param.py +40 -22
  68. experimaestro/tests/test_tags.py +5 -11
  69. experimaestro/tests/test_tokens.py +3 -2
  70. experimaestro/tests/test_types.py +17 -14
  71. experimaestro/tests/test_validation.py +48 -91
  72. experimaestro/tokens.py +16 -5
  73. experimaestro/typingutils.py +7 -0
  74. experimaestro/utils/asyncio.py +6 -2
  75. experimaestro/utils/resources.py +7 -3
  76. {experimaestro-1.6.1.dist-info → experimaestro-1.7.0.dist-info}/METADATA +3 -4
  77. experimaestro-1.7.0.dist-info/RECORD +154 -0
  78. {experimaestro-1.6.1.dist-info → experimaestro-1.7.0.dist-info}/WHEEL +1 -1
  79. experimaestro-1.6.1.dist-info/RECORD +0 -122
  80. {experimaestro-1.6.1.dist-info → experimaestro-1.7.0.dist-info}/LICENSE +0 -0
  81. {experimaestro-1.6.1.dist-info → experimaestro-1.7.0.dist-info}/entry_points.txt +0 -0
@@ -2,18 +2,9 @@
2
2
 
3
3
  import pytest
4
4
  from pathlib import Path
5
- from experimaestro import (
6
- config,
7
- Task,
8
- Identifier,
9
- argument,
10
- pathoption,
11
- ConstantParam,
12
- Param,
13
- Config,
14
- )
5
+ from experimaestro import Task, field, Identifier, Constant, Param, Config, Meta
15
6
  from enum import Enum
16
- import experimaestro.core.types as types
7
+ from experimaestro.generators import PathGenerator
17
8
  from experimaestro.scheduler import Job, JobContext
18
9
  from experimaestro.scheduler.workspace import RunMode
19
10
  from .utils import TemporaryExperiment
@@ -31,57 +22,50 @@ def expect_notvalidate(value):
31
22
  value.__xpm__.validate()
32
23
 
33
24
 
34
- @argument("value", type=int)
35
- @config()
36
- class A:
37
- pass
25
+ class A(Config):
26
+ value: Param[int]
38
27
 
39
28
 
40
- @argument("a", type=A)
41
- @config()
42
- class B:
43
- pass
29
+ class B(Config):
30
+ a: Param[A]
44
31
 
45
32
 
46
- @pathoption("path", "outdir")
47
- @config()
48
- class C:
33
+ class C(Config):
34
+ path: Meta[Path] = field(default_factory=PathGenerator("outdir"))
49
35
  pass
50
36
 
51
37
 
52
- def test_simple():
38
+ def test_validation_simple():
53
39
  expect_validate(A(value=1))
54
40
 
55
41
 
56
- def test_missing():
42
+ def test_validation_missing():
57
43
  expect_notvalidate(A())
58
44
 
59
45
 
60
- def test_simple_nested():
46
+ def test_validation_simple_nested():
61
47
  b = B()
62
48
  b.a = A(value=1)
63
49
  expect_validate(b)
64
50
 
65
51
 
66
- def test_missing_nested():
52
+ def test_validation_missing_nested():
67
53
  b = B()
68
54
  b.a = A()
69
55
  expect_notvalidate(b)
70
56
 
71
57
 
72
- def test_type():
73
- @config(valns.type.a)
74
- class A:
58
+ def test_validation_type():
59
+ class A(Config):
60
+ __xpmid__ = valns.type.a
75
61
  pass
76
62
 
77
- @config(valns.type.b)
78
- class B:
79
- pass
63
+ class B(Config):
64
+ __xpmid__ = valns.type.b
80
65
 
81
- @argument("a", A)
82
- @config(valns.type.c)
83
- class C:
84
- pass
66
+ class C(Config):
67
+ a: Param[A]
68
+ __xpmid__ = valns.type.c
85
69
 
86
70
  with pytest.raises(ValueError):
87
71
  C(a=B())
@@ -91,30 +75,26 @@ def test_type():
91
75
  c.a = B()
92
76
 
93
77
 
94
- def test_subtype():
95
- @config(valns.subtype.a)
96
- class A:
97
- pass
78
+ def test_validation_subtype():
79
+ class A(Config):
80
+ __xpmid__ = valns.subtype.a
98
81
 
99
- @config(valns.subtype.a1)
100
82
  class A1(A):
101
- pass
83
+ __xpmid__ = valns.subtype.a1
102
84
 
103
- @argument("a", A)
104
- @config(valns.subtype.b)
105
- class B:
106
- pass
85
+ class B(Config):
86
+ __xpmid__ = valns.subtype.b
87
+ a: Param[A]
107
88
 
108
89
  expect_validate(B(a=A1()))
109
90
 
110
91
 
111
- def test_path():
112
- """Test of @pathoption"""
92
+ def test_validation_path_generator():
93
+ """Test of path generator"""
113
94
 
114
- @pathoption("value", "file.txt")
115
- @config(valns.path.a)
116
- class A:
117
- pass
95
+ class A(Config):
96
+ __xpmid__ = valns.path.a
97
+ value: Meta[Path] = field(default_factory=PathGenerator("file.txt"))
118
98
 
119
99
  a = A()
120
100
  a.__xpm__.validate()
@@ -129,13 +109,12 @@ def test_path():
129
109
  assert a.value.parents[3] == xp.workspace.path
130
110
 
131
111
 
132
- def test_constant():
133
- """Test of @ConstantParam"""
112
+ def test_validation_constant():
113
+ """Test of constant"""
134
114
 
135
- @ConstantParam("value", 1)
136
- @config(valns.constant.a)
137
- class A:
138
- pass
115
+ class A(Config):
116
+ __xpmid__ = valns.constant.a
117
+ value: Constant[int] = 1
139
118
 
140
119
  a = A()
141
120
  a.__xpm__.validate()
@@ -145,31 +124,26 @@ def test_constant():
145
124
  assert a.value == 1
146
125
 
147
126
 
148
- @argument("x", type=int)
149
- @config()
150
- class Parent:
151
- pass
127
+ class Parent(Config):
128
+ x: Param[int]
152
129
 
153
130
 
154
- @config()
155
131
  class Child(Parent):
156
132
  pass
157
133
 
158
134
 
159
- def test_child():
135
+ def test_validation_child():
160
136
  expect_validate(Child(x=1))
161
137
 
162
138
 
163
139
  # --- Path argument checks
164
140
 
165
141
 
166
- @pathoption("x", "x")
167
- @config()
168
- class PathParent:
169
- pass
142
+ class PathParent(Config):
143
+ x: Meta[Path] = field(default_factory=PathGenerator("x"))
170
144
 
171
145
 
172
- def test_path_option():
146
+ def test_validation_path_option():
173
147
  c = PathParent()
174
148
  expect_validate(c)
175
149
 
@@ -177,28 +151,11 @@ def test_path_option():
177
151
  # --- Default value
178
152
 
179
153
 
180
- @pytest.mark.parametrize(
181
- "value,apitype",
182
- [(1.5, types.FloatType), (1, types.IntType), (False, types.BoolType)],
183
- )
184
- def test_default(value, apitype):
185
- @argument("default", default=value)
186
- @config(valns.default[str(type(value))])
187
- class Default:
188
- pass
189
-
190
- value = Default()
191
- expect_validate(value)
192
- assert Default.__xpmtype__.arguments["default"].type.__class__ == apitype
193
-
194
-
195
- def test_seal():
154
+ def test_validation_seal():
196
155
  """Test value sealing"""
197
156
 
198
- @argument("a", int)
199
- @config()
200
- class A:
201
- pass
157
+ class A(Config):
158
+ a: Param[int]
202
159
 
203
160
  a = A(a=2)
204
161
  a.__xpm__.seal(EmptyContext())
@@ -207,7 +164,7 @@ def test_seal():
207
164
  a.a = 1
208
165
 
209
166
 
210
- def test_validation_enum():
167
+ def test_validation_validation_enum():
211
168
  """Path arguments should be ignored"""
212
169
 
213
170
  class EnumParam(Enum):
@@ -241,7 +198,7 @@ class TaskConfigConsumer(Config):
241
198
  x: Param[TaskParentConfig]
242
199
 
243
200
 
244
- def test_taskargument():
201
+ def test_validation_taskargument():
245
202
  x = taskconfig()
246
203
  with TemporaryExperiment("fake"):
247
204
  x.submit(run_mode=RunMode.DRY_RUN)
experimaestro/tokens.py CHANGED
@@ -59,6 +59,8 @@ class CounterTokenLock(Lock):
59
59
 
60
60
 
61
61
  class CounterTokenDependency(Dependency):
62
+ """A dependency onto a token"""
63
+
62
64
  def __init__(self, token: "CounterToken", count: int):
63
65
  super().__init__(token)
64
66
  self._token = token
@@ -66,6 +68,7 @@ class CounterTokenDependency(Dependency):
66
68
 
67
69
  @property
68
70
  def name(self):
71
+ """The (file) name for this dependency, when taken"""
69
72
  return f"{self.target.identifier}.token"
70
73
 
71
74
  def status(self) -> DependencyStatus:
@@ -165,7 +168,7 @@ class CounterToken(Token, FileSystemEventHandler):
165
168
  - TIMESTAMP.token contains (1) the number of tokens (2) the job URI
166
169
  """
167
170
 
168
- """Maps paths to instances"""
171
+ """Maps token keys to CounterToken instances"""
169
172
  TOKENS: Dict[str, "CounterToken"] = {}
170
173
 
171
174
  @staticmethod
@@ -193,7 +196,7 @@ class CounterToken(Token, FileSystemEventHandler):
193
196
  """[summary]
194
197
 
195
198
  Arguments:
196
- path {Path} -- The file path of the token file
199
+ path {Path} -- The file path of the token directory
197
200
  count {int} -- Number of tokens (overrides previous definitions)
198
201
  force -- If the token has already been created, force to write the maximum
199
202
  number of tokens
@@ -298,6 +301,9 @@ class CounterToken(Token, FileSystemEventHandler):
298
301
  tokenfile = TokenFile(path)
299
302
  tokenfile.watch()
300
303
  self.cache[path.name] = tokenfile
304
+ except FileNotFoundError:
305
+ # We did not find the token file... just ignore
306
+ pass
301
307
  except Exception:
302
308
  logger.exception("Uncaught exception in on_modified handler")
303
309
  raise
@@ -336,13 +342,18 @@ class CounterToken(Token, FileSystemEventHandler):
336
342
  for dependency in dependents:
337
343
  dependency.check()
338
344
 
345
+ # A modified dependency not in cache
339
346
  elif path.name.endswith(".token") and path.name not in self.cache:
340
347
  with self.lock:
341
348
  if path.name not in self.cache:
342
349
  logger.debug("Token file not in cache %s", path.name)
343
- tokenfile = TokenFile(path)
344
- tokenfile.watch()
345
- 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
346
357
  except Exception:
347
358
  logger.exception("Uncaught exception in on_modified handler")
348
359
  raise
@@ -26,6 +26,13 @@ def isgenericalias(typehint):
26
26
  return isinstance(typehint, GenericAlias)
27
27
 
28
28
 
29
+ def get_union(typehint):
30
+ """Return the list of types of a union (or the type itself if it is not an union)"""
31
+ if isgenericalias(typehint) and typehint.__origin__ == typing.Union:
32
+ return typehint.__args__
33
+ return None
34
+
35
+
29
36
  def get_optional(typehint):
30
37
  if isgenericalias(typehint) and typehint.__origin__ == typing.Union:
31
38
  if len(typehint.__args__) == 2:
@@ -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
@@ -24,15 +24,19 @@ class ResourcePathWrapper(PathLike):
24
24
  parents = [s.name for s in reversed(self.path.parents)][1:]
25
25
  return ".".join(parents)
26
26
 
27
- @property
27
+ @cached_property
28
28
  def name(self):
29
29
  return self.path.name
30
30
 
31
31
  def is_file(self):
32
- 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
+ )
33
36
 
34
37
  def __fspath__(self):
35
- return resources.path(self.package, self.name).__fspath__()
38
+ """Return the file system path representation of the object"""
39
+ return resources.as_file(resources.files(self.package) / self.name)
36
40
 
37
41
  @contextmanager
38
42
  def open(self, *args, **kwargs):
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: experimaestro
3
- Version: 1.6.1
3
+ Version: 1.7.0
4
4
  Summary: "Experimaestro is a computer science experiment manager"
5
5
  License: GPL-3
6
6
  Keywords: experiment manager
7
7
  Author: Benjamin Piwowarski
8
8
  Author-email: benjamin@piwowarski.fr
9
- Requires-Python: >=3.8,<4.0
9
+ Requires-Python: >=3.9,<4.0
10
10
  Classifier: Development Status :: 4 - Beta
11
11
  Classifier: Intended Audience :: Science/Research
12
12
  Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
@@ -14,7 +14,6 @@ Classifier: License :: Other/Proprietary License
14
14
  Classifier: Operating System :: OS Independent
15
15
  Classifier: Programming Language :: Python
16
16
  Classifier: Programming Language :: Python :: 3
17
- Classifier: Programming Language :: Python :: 3.8
18
17
  Classifier: Programming Language :: Python :: 3.9
19
18
  Classifier: Programming Language :: Python :: 3.10
20
19
  Classifier: Programming Language :: Python :: 3.11
@@ -35,7 +34,7 @@ Requires-Dist: huggingface-hub (>0.17)
35
34
  Requires-Dist: humanfriendly (>=10,<11)
36
35
  Requires-Dist: marshmallow (>=3.20,<4.0)
37
36
  Requires-Dist: omegaconf (>=2.3,<3.0)
38
- Requires-Dist: psutil (>=5.9.5,<6.0.0)
37
+ Requires-Dist: psutil (>=7)
39
38
  Requires-Dist: pyparsing (>=3.1,<4.0)
40
39
  Requires-Dist: pytools (>=2023.1.1,<2024.0.0)
41
40
  Requires-Dist: pyyaml (>=6.0.1,<7.0.0)
@@ -0,0 +1,154 @@
1
+ experimaestro/__init__.py,sha256=qZXkir1sdCNkJ72W0OwpfH0c_Xk0OFczHrxZ1ORiWN8,1548
2
+ experimaestro/__main__.py,sha256=Dv9lFl03yt1dswd0Xb9NIJRgHpA5_IwH4RfQPEHyFz0,158
3
+ experimaestro/annotations.py,sha256=wyVmPlkXuoT6IxJ-ti8bFo6HxhGY1BYBxM5-pib6shU,8773
4
+ experimaestro/checkers.py,sha256=ZCMbnE_GFC5compWjt-fuHhPImi9fCPjImF8Ow9NqK8,696
5
+ experimaestro/cli/__init__.py,sha256=mzc-qqTFtZnFwCQl7IiwlYXEx08kLGwdntWayCerZ6E,9610
6
+ experimaestro/cli/filter.py,sha256=sdP651rnvMfzdwRdv0AiG1BqK8Z6Mia8l-D-qatGB04,5781
7
+ experimaestro/cli/jobs.py,sha256=QJNno0r6aKylol9jsGRgEPRmehEIyl7pv7CZk-DfvJg,7771
8
+ experimaestro/click.py,sha256=6BkeQHEgcxaxzq3xEvEEzwzuBj5-dkfrpOGikuA8L00,1377
9
+ experimaestro/commandline.py,sha256=MJIJcfppGCjNA8ozxXUzbUSeDOlTExuzhxryGx3_lIo,9314
10
+ experimaestro/compat.py,sha256=dQqE2ZNHLM2wtdfp7fBRYMfC33qNehVf9J6FGRBUQhs,171
11
+ experimaestro/connectors/__init__.py,sha256=Pe8CZ73IedTIb51-zbdMMk-JFFkZ0t1cOL6QuvdSJjg,6026
12
+ experimaestro/connectors/local.py,sha256=348akOw69t7LgiTBMPG5McCg821I8qfR5GvYNU14sv4,6051
13
+ experimaestro/connectors/ssh.py,sha256=5giqvv1y0QQKF-GI0IFUzI_Z5H8Bj9EuL_Szpvk899Q,8600
14
+ experimaestro/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
+ experimaestro/core/arguments.py,sha256=7hpkU1f8LJ7JL8kQaD514h9CFSfMotYLsVfMsMmdpWk,6487
16
+ experimaestro/core/context.py,sha256=Q8_ngiHRBZ0laavXRJNiDvdCprrnROVTWaHfrwMdlG4,2638
17
+ experimaestro/core/objects.py,sha256=6LDQzdH55n10Yck_6yee2rJzNICaiTNYl_yZY5dtbAg,67344
18
+ experimaestro/core/objects.pyi,sha256=NElf7J-1rL2l9Td6fQofRj-UQTtt7d0tlO7NUyewqYI,7283
19
+ experimaestro/core/serialization.py,sha256=9tg5ebLF3YeZ_zG9DiTHPLthppvo7io710ohD_dcLTo,3836
20
+ experimaestro/core/serializers.py,sha256=R_CAMyjjfU1oi-eHU6VlEUixJpFayGqEPaYu7VsD9xA,1197
21
+ experimaestro/core/types.py,sha256=gSLv9F1HszVxI8jla6e-aVVS7q3KBwSzG1MImUHdGMg,21158
22
+ experimaestro/core/utils.py,sha256=JfC3qGUS9b6FUHc2VxIYUI9ysNpXSQ1LjOBkjfZ8n7o,495
23
+ experimaestro/exceptions.py,sha256=cUy83WHM3GeynxmMk6QRr5xsnpqUAdAoc-m3KQVrE2o,44
24
+ experimaestro/experiments/__init__.py,sha256=GcpDUIbCvhnv6rxFdAp4wTffCVNTv-InY6fbQAlTy-o,159
25
+ experimaestro/experiments/cli.py,sha256=fvHz2aih7Aw1DK3GoVkeaVtG3r1tU6qbnwIv-uD0eVI,8697
26
+ experimaestro/experiments/configuration.py,sha256=cFDiUHnUGblJsctAUxAqx0jlM7_Ja_527lzk-4G-44k,1368
27
+ experimaestro/generators.py,sha256=DQsEgdMwRUud9suWr-QGxI3vCO5sywP6MVGZWRNQXkk,1372
28
+ experimaestro/huggingface.py,sha256=gnVlr6SZnbutYz4PLH0Q77n1TRF-uk-dR-3UFzFqAY0,2956
29
+ experimaestro/ipc.py,sha256=Xn3tYME83jLEB0nFak3DwEIhpL5IRZpCl3jirBF_jl4,1570
30
+ experimaestro/launcherfinder/__init__.py,sha256=qRUDyv3B9UsAM8Q31mRrZrTZox0AptwdmOY4f2K-TUo,279
31
+ experimaestro/launcherfinder/base.py,sha256=q47SsF_cXdo5O6ZhFKn5385WVFcx8Wd-BcEpd6tRpbs,515
32
+ experimaestro/launcherfinder/parser.py,sha256=pYbfEJw7osnqZWm7fkVhQawhpNU8dLU_6vEjtXdc8E8,2279
33
+ experimaestro/launcherfinder/registry.py,sha256=4Ix86rrooRucOlKtiCufmdvrebT-FRrzpqQu0qHpJJg,6337
34
+ experimaestro/launcherfinder/specs.py,sha256=G8za6mEmkVxuZY_ab3OhWJIpONpcBMO_iXeB30sUbhI,6448
35
+ experimaestro/launchers/__init__.py,sha256=lXn544sgJExr6uirILWzAXu_IfmfyqFZOt4OzRnjHXg,2525
36
+ experimaestro/launchers/direct.py,sha256=JZh6WOPnO6ED_xlOs8pL4MRFmnRhmXzpVxTl-ByaD2A,258
37
+ experimaestro/launchers/oar.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
+ experimaestro/launchers/slurm/__init__.py,sha256=R1Zwd4phZaXV8FwCYhzfB44n0V4cf-hBQzOc6NkFQ0s,41
39
+ experimaestro/launchers/slurm/base.py,sha256=s6rE_wQBmFuW_Ee75F4iG2ktpWHdKY_SXQsZs3qObB8,15678
40
+ experimaestro/locking.py,sha256=hPT-LuDGZTijpbme8O0kEoB9a3WjdVzI2h31OT44UxE,1477
41
+ experimaestro/mkdocs/__init__.py,sha256=u3AT-uBu3PqyZZXBr6U_ffioEoSZngDdw85005DbyDA,34
42
+ experimaestro/mkdocs/annotations.py,sha256=qpDw8lzrxpsOShXcpcP_LAeR3UhiIXAybG8UvS64-OU,263
43
+ experimaestro/mkdocs/base.py,sha256=SwLh9s7BZfrTAZdBaealSqVeLAroDSwLLMOHmLCxMPQ,16716
44
+ experimaestro/mkdocs/metaloader.py,sha256=qCqnTWhlgxql-oe46E8AbvYdoM311-lQh-msmPnbllQ,1481
45
+ experimaestro/mkdocs/style.css,sha256=42kJ6Ozq_n4Iw5UfJ4-nO1u-HN3ELvV7Vhvj1Xkn7rQ,66
46
+ experimaestro/mypy.py,sha256=M39VFuDrab-ymlCDIF5jys9oKpTwnuBPzb1T8Un5J3s,285
47
+ experimaestro/notifications.py,sha256=UOcCai8wPGzAI_Zu1-KUr9a8Ns1eHUym3gwjUHXUtSE,9274
48
+ experimaestro/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
49
+ experimaestro/rpyc.py,sha256=ZRKol-3tVoeoUITLNFenLF4dhWBLW_FvSV_GvsypmeI,3605
50
+ experimaestro/run.py,sha256=58ZlIZ2dQ7a0un2iGiyHJhK14zc18BnpEFDis7OyTPA,5222
51
+ experimaestro/scheduler/__init__.py,sha256=ERmmOxz_9mUkIuccNbzUa5Y6gVLLVDdyc4cCxbCCUbY,20
52
+ experimaestro/scheduler/base.py,sha256=R40hKI_2cpyZ8F4GTwEulTWczPAaGYi1UaaELh9etGM,35368
53
+ experimaestro/scheduler/dependencies.py,sha256=n9XegwrmjayOIxt3xhuTEBVEBGSq4oeVdzz-FviDGXo,1994
54
+ experimaestro/scheduler/dynamic_outputs.py,sha256=yYPL98I0nSgDjlE3Sk9dtvovh2PZ6rUDnKjDNnAg1dc,5732
55
+ experimaestro/scheduler/services.py,sha256=aCKkNZMULlceabqf-kOs_-C7KPINnjU3Q-I00o5x6iY,2189
56
+ experimaestro/scheduler/workspace.py,sha256=KNdxPBwUk7gO8h2utMCrlIVKB-f2Ylqg_IxLc4okp_8,2320
57
+ experimaestro/scriptbuilder.py,sha256=6GKUkgixLqSEy41sNr-_HNcrjKb8uxaoQ65DywRYsC0,5027
58
+ experimaestro/server/__init__.py,sha256=F2bzLf2q29Haj2OIbPA26r5WVbaipBNylIozg-As758,10854
59
+ experimaestro/server/data/016b4a6cdced82ab3aa1.ttf,sha256=AD8RVBhWpkmmyCNcYmbIk2IkxdYJ5RRC2iTcVVbRT78,189684
60
+ experimaestro/server/data/0c35d18bf06992036b69.woff2,sha256=gmX2R4Y5fWuDLRygqv3xSa2E5ydZ__qfcnLpGg-wFdE,128352
61
+ experimaestro/server/data/1815e00441357e01619e.ttf,sha256=gIRDrmyCBDla3YVD2oqQpguTdvsPh-2OjqN9EJWW2AU,210792
62
+ experimaestro/server/data/219aa9140e099e6c72ed.woff2,sha256=0xv7gdVueQ4Nni-gC4Pfj3FZ-QYxFM3AFIWbHUg5Vsg,135984
63
+ experimaestro/server/data/2463b90d9a316e4e5294.woff2,sha256=qnWZhiOjkeYcaQF5Ss6DLj7N0oi1bWCPIb6gQRrMC44,158220
64
+ experimaestro/server/data/2582b0e4bcf85eceead0.ttf,sha256=0vBZNUCw4zum3iVaVPJy1GbjEUSAaVa-qM_b9-3_yb0,426112
65
+ experimaestro/server/data/3a4004a46a653d4b2166.woff,sha256=-jiI7_pbxjPGuygaSdiSf-eqACEsn8D3M4yBnsXMFu4,156236
66
+ experimaestro/server/data/3baa5b8f3469222b822d.woff,sha256=PTTzCsa7Ivpb9Y0-Uue7bezZnFcdanfV36e-eL7PK1A,339600
67
+ experimaestro/server/data/4d73cb90e394b34b7670.woff,sha256=_YT4i0lwQNT31ejJ-GNa740-cGwPpS4rb6zxTu6H5SI,164912
68
+ experimaestro/server/data/4ef4218c522f1eb6b5b1.woff2,sha256=Hmc7qFiWVHlNKtN1woc_GHCkV48rPoR9zEB63QO1esI,215704
69
+ experimaestro/server/data/50701fbb8177c2dde530.ttf,sha256=fYGhp8wH4asZbkBJbT9DWel1n3nY7Ig6Rmde5pkSlQs,63348
70
+ experimaestro/server/data/5d681e2edae8c60630db.woff,sha256=HBNbFRpB4jE4sy0wZePw6rIwpnrv6SXplwnL4QK9YEw,206260
71
+ experimaestro/server/data/6f420cf17cc0d7676fad.woff2,sha256=NdyopxRaF8jRMG8lo8oJFXjhU5bwsi1h645zJirHVXc,155276
72
+ experimaestro/server/data/878f31251d960bd6266f.woff2,sha256=-q5vwKqUzFveUHZkfIF6IyBglqHL7aENHG89idYWPtE,109808
73
+ experimaestro/server/data/89999bdf5d835c012025.woff2,sha256=40VtEoO511M3p3Pf0Ue_kI_QLAG0v0hXbYYDppsTy-U,25472
74
+ experimaestro/server/data/914997e1bdfc990d0897.ttf,sha256=VM9ghve7IfnQcq1JShm0aB-lFt0KFM7lLaAdNlGpE6M,68064
75
+ experimaestro/server/data/b041b1fa4fe241b23445.woff2,sha256=kWnYvnqBd-WpKk0Ett5_ZQS5OFc79NpYiYccTzdtOEk,24488
76
+ experimaestro/server/data/b6879d41b0852f01ed5b.woff2,sha256=iGyGESqATvHd0csgavTIxA40tzwmZSyiMUBKo1prMNk,150020
77
+ experimaestro/server/data/c210719e60948b211a12.woff2,sha256=1yNqGb8jy7ICcoDo9R3JnWxFl2ou1g3nM4KwNLGKK2g,118684
78
+ experimaestro/server/data/c380809fd3677d7d6903.woff2,sha256=yUjxJjNBaZs8HpxV2NDz5EZmnQ8rnVVJTGFpIiwCQ6Y,173620
79
+ experimaestro/server/data/d75e3fd1eb12e9bd6655.ttf,sha256=zqebNFyvSdYiMJi4orBNcCc-jXxrnj0Dz396JneT6ao,394668
80
+ experimaestro/server/data/f882956fd323fd322f31.woff,sha256=jpR1jFTCboWqzy09yhrXqtpZBKRgI4-uSEPrxEvELtw,182028
81
+ experimaestro/server/data/favicon.ico,sha256=PRD32mxgMXg0AIFmjErFs66XQ8qaJiqw_NMS-7n0i90,3870
82
+ experimaestro/server/data/index.css,sha256=hujPctk1MO9fdUpzFiveEKQzkiABNGmeJOtNoUMqDAY,392757
83
+ experimaestro/server/data/index.css.map,sha256=rKkhyfo3OaALku4FrL0Lqs8-mjxfXlkvPIk5V-LfaBs,575718
84
+ experimaestro/server/data/index.html,sha256=LcXSo2QU5jcmqgmFhVWWOG_CfGyrqdm3H8jwkdRgdGU,706
85
+ experimaestro/server/data/index.js,sha256=q8oG4RM5rRjIGmI1szIrLTxigTHNkVUG1BuHbcjUeSw,3710972
86
+ experimaestro/server/data/index.js.map,sha256=cv7KF28Uq5dy7Ux3yRnoSVztrOFVid359fm0Xn2IJ6s,3903046
87
+ experimaestro/server/data/login.html,sha256=4dvhSOn6DHp_tbmzqIKrqq2uAo0sAUbgLVD0lTnPp4s,511
88
+ experimaestro/server/data/manifest.json,sha256=EpzHQZzrGh9c1Kf63nrqvI33H1cm0nLYfdh5lDm8ijI,318
89
+ experimaestro/settings.py,sha256=U6gTVBL5Z4Rk0_7BAVoavVJKN2sQNRpspE-601Elfys,3170
90
+ experimaestro/sphinx/__init__.py,sha256=HAofa65lCLAUOShgWwJIGEEOPKzu4VEs5LZd46V_Bng,9466
91
+ experimaestro/sphinx/static/experimaestro.css,sha256=0rEgt1LoDdD-a_R5rVfWZ19zD1gR-1L7q3f4UibIB58,294
92
+ experimaestro/taskglobals.py,sha256=Lp0bqobVLndR7fOtF9qPI7utTKQXXwTdVN6l5Av9Dc4,660
93
+ experimaestro/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
94
+ experimaestro/tests/conftest.py,sha256=CtC6TvUS9sbgSc3pZYyTyEvfilnNGPpOUJvi-jn6twI,695
95
+ experimaestro/tests/connectors/bin/executable.py,sha256=RmCrH_MQiHuPRyeTP2jut0ASpfvHEH1QCxRnlvDZW2s,21
96
+ experimaestro/tests/connectors/test_local.py,sha256=hMX3maYYRABGXqRZFZbTWjf-jcvPkBq9nReLtDwLydk,1204
97
+ experimaestro/tests/connectors/utils.py,sha256=9sM3Pwy2nRfSr7pwQoOoSCDhBrEcDsEElI08Fmrw_gU,702
98
+ experimaestro/tests/definitions_types.py,sha256=nMoQxZxhTJAYV87Ce9F2dAITxXGHf7Uw5j-MKsZ3LmQ,399
99
+ experimaestro/tests/launchers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
100
+ experimaestro/tests/launchers/bin/sacct,sha256=9mmRAYCE4RBSBOf7aanhFw9hzujOUlcw3OJmZJ3K-Wc,639
101
+ experimaestro/tests/launchers/bin/sbatch,sha256=KgG4xUiIpELHBWLjnM7IUBu5jKiIGnILS9HfHE5eVFk,1715
102
+ experimaestro/tests/launchers/bin/srun,sha256=3oE3qq0UFpVtTvXfR1kH3tovFYX74fp1Fk-o8zgsaJA,47
103
+ experimaestro/tests/launchers/bin/test.py,sha256=MbxdAd2Sf7T-Hj3ldmrtngbQuBdNOkXjMcICJTf39wI,477
104
+ experimaestro/tests/launchers/common.py,sha256=E09KhrQfNQNZbaeVkXBgHk2906DvaCEU7CqEQvLbZTE,2994
105
+ experimaestro/tests/launchers/config_slurm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
106
+ experimaestro/tests/launchers/config_slurm/launchers.py,sha256=DohwQVv1eXWfDpAYFg7KJekEm7q7G-lMou2lPg-PKOk,838
107
+ experimaestro/tests/launchers/test_local.py,sha256=4oGgWH2YgkEm-Muu6s4cwlgriXtYr5xAd72DVoIw_Yk,717
108
+ experimaestro/tests/launchers/test_slurm.py,sha256=5s-mMtqvE62xJ_GijLd4Hmsu3vWCRCbFy7cPce8YKsM,2534
109
+ experimaestro/tests/restart.py,sha256=wivq06i3SoxL_cUKti9J_o3MykynmLic6czuCZSHc_M,4139
110
+ experimaestro/tests/restart_main.py,sha256=iAFzw0H1q9Aq7t6TrSAj236QBnYU52qx0VF-2dz6tx4,295
111
+ experimaestro/tests/scripts/notifyandwait.py,sha256=3BLXLI5XgP3BnKf6sQ56oKoMVqR80VMHmploJ3JO6Ko,407
112
+ experimaestro/tests/scripts/waitforfile.py,sha256=EDT-TuFi2fU_qt51K5EmAxjw_OnJKkBW7UCfhrtDbVw,120
113
+ experimaestro/tests/task_tokens.py,sha256=vgqUa-S_YC2Id9pGOSv40qFTwq1WGZkFhr556Z5o678,477
114
+ experimaestro/tests/tasks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
115
+ experimaestro/tests/tasks/all.py,sha256=OMkHsWZkErCmTajiNO7hNhvnk9eKzJC-VatWgabWlsI,1955
116
+ experimaestro/tests/tasks/foreign.py,sha256=uhXDOcWozkcm26ybbeEU9RElJpbhjC-zdzmlSKfPcdY,122
117
+ experimaestro/tests/test_checkers.py,sha256=Kg5frDNRE3pvWVmmYzyk0tJFNO885KOrK48lSu-NlYA,403
118
+ experimaestro/tests/test_dependencies.py,sha256=xfWrSkvjT45G4FSCL535m1huLT2ghmyW7kvP_XvvCJQ,2005
119
+ experimaestro/tests/test_findlauncher.py,sha256=8tjpR8bLMi6Gjs7KpY2t64izZso6bmY7vIivMflm-Bc,2965
120
+ experimaestro/tests/test_forward.py,sha256=9y1zYm7hT_Lx5citxnK7n20cMZ2WJbsaEeY5irCZ9U4,735
121
+ experimaestro/tests/test_identifier.py,sha256=L-r0S0dI9ErOZSmqGOPbbUZBvWJ-uzc3sijoyTPyMYU,13680
122
+ experimaestro/tests/test_instance.py,sha256=ZlKKFdffSEIgW4vgR0JuNvxH9q1UNmmk9EjFQs27Nd4,1518
123
+ experimaestro/tests/test_objects.py,sha256=6PSG5FtqkiLg2OK26ZzvBYbJYPbFpyDYZtKS-DbiXIs,2037
124
+ experimaestro/tests/test_outputs.py,sha256=DYzPk5TT_yLumy8SsQbl-S66ivVxJ-ERFrZ68KQZ4KU,781
125
+ experimaestro/tests/test_param.py,sha256=R6NTuOBXJiL0wnshwG1KRtGtLUijI5WnBzzdg26qiXo,6899
126
+ experimaestro/tests/test_progress.py,sha256=wtIGQzlV3ldd_wMng11LinVESchW-1J954mCJNlG28E,7580
127
+ experimaestro/tests/test_serializers.py,sha256=xSCezAM9yH_Ix1wr7j0au9SyBv9DtZ7b0zs2-Ynt-VM,2338
128
+ experimaestro/tests/test_snippets.py,sha256=rojnyDjtmAMnSuDUj6Bv9XEgdP8oQf2nVc132JF8vsM,3081
129
+ experimaestro/tests/test_ssh.py,sha256=KS1NWltiXrJBSStY9d4mwrexeqgNGWmhxuAU_WLQDAU,1449
130
+ experimaestro/tests/test_tags.py,sha256=v_8_7LuEHfY_gfa0JRCUkmgJh8h6RMya_nd5NcPAJPw,2852
131
+ experimaestro/tests/test_tasks.py,sha256=bUSB_UT1MTN2P_RPHd4AT5NK-DFsgCVeFKSiXu3bEz8,9429
132
+ experimaestro/tests/test_tokens.py,sha256=U3nKBL1KftWhmk3dQZZLQd-MLJL_SscMjI3zMieMHfc,7823
133
+ experimaestro/tests/test_types.py,sha256=BydwlwJHXtoiSo-6AtdvLdfS1JyAQVNFwznJwwjlvCk,1299
134
+ experimaestro/tests/test_validation.py,sha256=t0fu-5wkCzpUKLu8K0rbU5zDE_LtsgehWm84HtIF5JY,4076
135
+ experimaestro/tests/token_reschedule.py,sha256=V8lAbjTWTatBrBjxde_KN-fDEI4sQ3HNr4scCXBU6fI,1701
136
+ experimaestro/tests/utils.py,sha256=41krZFgUaCxCYBQPmo5dNFDd9W6RU8ZzzyzY3FyutUI,3805
137
+ experimaestro/tokens.py,sha256=ZnsDnfJgyAUgThv0c-ta28CrHre0gRyQF6q5FD9tCLY,15147
138
+ experimaestro/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
139
+ experimaestro/tools/diff.py,sha256=FBCwupPrSwkEOcqYu0NWe7LTkuOW6r-_btoCel2_k_I,3436
140
+ experimaestro/tools/documentation.py,sha256=O2UzjzodPqGot3YSe6NYlK7S42XpplakUdqxFpvjqHQ,9184
141
+ experimaestro/tools/jobs.py,sha256=63bXhJ7RGdczLU_nxu2skGn-9dwgr4r5pD23qH4WeBA,3516
142
+ experimaestro/typingutils.py,sha256=XjEljfizrUeVedWVmtnYFpeTEJ2I8zU1xj3CxkZ8mJ8,3572
143
+ experimaestro/utils/__init__.py,sha256=BdYguxAbR1jOQPV36OgGA31itaMvBJ6WVPV6b4Jn4xw,2434
144
+ experimaestro/utils/asyncio.py,sha256=9r_vFQs6T6tqmymC_DbHVFhY9YVRO6X48uEuyL_ugP8,726
145
+ experimaestro/utils/jobs.py,sha256=42FAdKcn_v_-M6hcQZPUBr9kbDt1eVsk3a4E8Gc4eu8,2394
146
+ experimaestro/utils/jupyter.py,sha256=JcEo2yQK7x3Cr1tNl5FqGMZOICxCv9DwMvL5xsWdQPk,2183
147
+ experimaestro/utils/resources.py,sha256=j-nvsTFwmgENMoVGOD2Ap-UD3WU85WkI0IgeSszMCX4,1328
148
+ experimaestro/utils/settings.py,sha256=jpFMqF0DLL4_P1xGal0zVR5cOrdD8O0Y2IOYvnRgN3k,793
149
+ experimaestro/xpmutils.py,sha256=S21eMbDYsHfvmZ1HmKpq5Pz5O-1HnCLYxKbyTBbASyQ,638
150
+ experimaestro-1.7.0.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
151
+ experimaestro-1.7.0.dist-info/METADATA,sha256=GpHJK3uW1LyNZqeTo9GI0Hwh7MSKBOxwuST50LjiXtU,6159
152
+ experimaestro-1.7.0.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
153
+ experimaestro-1.7.0.dist-info/entry_points.txt,sha256=TppTNiz5qm5xm1fhAcdLKdCLMrlL-eQggtCrCI00D9c,446
154
+ experimaestro-1.7.0.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.0.1
2
+ Generator: poetry-core 2.1.2
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any