experimaestro 1.5.3__tar.gz → 1.5.5__tar.gz
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.
- {experimaestro-1.5.3 → experimaestro-1.5.5}/PKG-INFO +2 -2
- {experimaestro-1.5.3 → experimaestro-1.5.5}/pyproject.toml +3 -3
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/__init__.py +0 -1
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/click.py +0 -35
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/experiments/cli.py +32 -14
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/run.py +24 -5
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/scheduler/base.py +31 -15
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/scheduler/workspace.py +26 -8
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/scriptbuilder.py +5 -1
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/settings.py +15 -5
- experimaestro-1.5.3/src/experimaestro/scheduler/environment.py +0 -94
- {experimaestro-1.5.3 → experimaestro-1.5.5}/LICENSE +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/README.md +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/__main__.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/annotations.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/checkers.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/commandline.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/compat.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/connectors/__init__.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/connectors/local.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/connectors/ssh.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/core/__init__.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/core/arguments.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/core/context.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/core/objects.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/core/objects.pyi +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/core/serialization.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/core/serializers.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/core/types.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/core/utils.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/exceptions.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/experiments/__init__.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/experiments/configuration.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/filter.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/generators.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/huggingface.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/ipc.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/launcherfinder/__init__.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/launcherfinder/base.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/launcherfinder/parser.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/launcherfinder/registry.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/launcherfinder/specs.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/launchers/__init__.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/launchers/direct.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/launchers/oar.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/launchers/slurm/__init__.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/launchers/slurm/base.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/launchers/slurm/cli.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/launchers/slurm/configuration.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/locking.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/mkdocs/__init__.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/mkdocs/annotations.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/mkdocs/base.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/mkdocs/metaloader.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/mkdocs/style.css +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/mypy.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/notifications.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/py.typed +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/rpyc.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/scheduler/__init__.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/scheduler/dependencies.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/scheduler/services.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/__init__.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/016b4a6cdced82ab3aa1.ttf +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/0c35d18bf06992036b69.woff2 +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/219aa9140e099e6c72ed.woff2 +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/3a4004a46a653d4b2166.woff +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/3baa5b8f3469222b822d.woff +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/4d73cb90e394b34b7670.woff +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/4ef4218c522f1eb6b5b1.woff2 +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/50701fbb8177c2dde530.ttf +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/5d681e2edae8c60630db.woff +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/6f420cf17cc0d7676fad.woff2 +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/878f31251d960bd6266f.woff2 +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/b041b1fa4fe241b23445.woff2 +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/b6879d41b0852f01ed5b.woff2 +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/c380809fd3677d7d6903.woff2 +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/d75e3fd1eb12e9bd6655.ttf +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/f882956fd323fd322f31.woff +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/favicon.ico +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/index.css +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/index.css.map +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/index.html +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/index.js +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/index.js.map +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/login.html +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/manifest.json +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/sphinx/__init__.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/sphinx/static/experimaestro.css +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/taskglobals.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/__init__.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/conftest.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/connectors/bin/executable.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/connectors/test_local.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/connectors/utils.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/definitions_types.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/launchers/__init__.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/launchers/bin/sacct +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/launchers/bin/sbatch +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/launchers/bin/test.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/launchers/common.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/launchers/config_slurm/__init__.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/launchers/config_slurm/launchers.yaml +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/launchers/test_local.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/launchers/test_slurm.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/restart.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/restart_main.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/scripts/notifyandwait.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/scripts/waitforfile.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/task_tokens.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/tasks/__init__.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/tasks/all.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/tasks/foreign.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/test_checkers.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/test_dependencies.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/test_findlauncher.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/test_forward.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/test_identifier.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/test_instance.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/test_objects.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/test_outputs.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/test_param.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/test_progress.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/test_serializers.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/test_snippets.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/test_ssh.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/test_tags.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/test_tasks.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/test_tokens.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/test_types.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/test_validation.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/token_reschedule.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/utils.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tokens.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tools/__init__.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tools/diff.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tools/documentation.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tools/jobs.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/typingutils.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/utils/__init__.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/utils/asyncio.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/utils/jobs.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/utils/jupyter.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/utils/resources.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/utils/settings.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/utils/yaml.py +0 -0
- {experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/xpmutils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: experimaestro
|
|
3
|
-
Version: 1.5.
|
|
3
|
+
Version: 1.5.5
|
|
4
4
|
Summary: "Experimaestro is a computer science experiment manager"
|
|
5
5
|
Home-page: https://github.com/experimaestro/experimaestro-python
|
|
6
6
|
License: GPL-3
|
|
@@ -41,7 +41,7 @@ Requires-Dist: pyparsing (>=3.1,<4.0)
|
|
|
41
41
|
Requires-Dist: pytools (>=2023.1.1,<2024.0.0)
|
|
42
42
|
Requires-Dist: pyyaml (>=6.0.1,<7.0.0)
|
|
43
43
|
Requires-Dist: requests (>=2.31,<3.0)
|
|
44
|
-
Requires-Dist: rpyc (>=5,<
|
|
44
|
+
Requires-Dist: rpyc (>=5,<7)
|
|
45
45
|
Requires-Dist: sortedcontainers (>=2.4,<3.0)
|
|
46
46
|
Requires-Dist: termcolor (>=2.3)
|
|
47
47
|
Requires-Dist: tqdm (>=4.66.1,<5.0.0)
|
|
@@ -19,7 +19,7 @@ include = [
|
|
|
19
19
|
"src/experimaestro/sphinx/static/experimaestro.css",
|
|
20
20
|
"src/experimaestro/mkdocs/style.css"
|
|
21
21
|
]
|
|
22
|
-
version = "1.5.
|
|
22
|
+
version = "1.5.5"
|
|
23
23
|
repository = "https://github.com/experimaestro/experimaestro-python"
|
|
24
24
|
documentation = "https://experimaestro-python.readthedocs.io/"
|
|
25
25
|
|
|
@@ -61,7 +61,7 @@ watchdog = "^2"
|
|
|
61
61
|
marshmallow = "^3.20"
|
|
62
62
|
fabric = "^3"
|
|
63
63
|
decorator = "^5"
|
|
64
|
-
rpyc = "
|
|
64
|
+
rpyc = ">=5,<7"
|
|
65
65
|
|
|
66
66
|
[tool.poetry.group.ssh]
|
|
67
67
|
optional = true
|
|
@@ -123,7 +123,7 @@ warn_unused_ignores = true
|
|
|
123
123
|
|
|
124
124
|
[tool.commitizen]
|
|
125
125
|
name = "cz_conventional_commits"
|
|
126
|
-
version = "1.5.
|
|
126
|
+
version = "1.5.5"
|
|
127
127
|
changelog_start_rev = "0.15.0"
|
|
128
128
|
tag_format = "v$version"
|
|
129
129
|
update_changelog_on_bump = true
|
|
@@ -53,7 +53,6 @@ from .core.context import SerializationContext
|
|
|
53
53
|
from .core.serializers import SerializationLWTask, PathSerializationLWTask
|
|
54
54
|
from .core.types import Any, SubmitHook
|
|
55
55
|
from .launchers import Launcher
|
|
56
|
-
from .scheduler.environment import Environment
|
|
57
56
|
from .scheduler.workspace import Workspace, RunMode
|
|
58
57
|
from .scheduler import Scheduler, experiment, FailedExperiment
|
|
59
58
|
from .notifications import progress, tqdm
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import click
|
|
2
|
-
from experimaestro import Environment
|
|
3
|
-
from experimaestro.run import parse_commandline
|
|
4
2
|
|
|
5
3
|
"""Defines the task command line argument prefix for experimaestro-handled command lines"""
|
|
6
4
|
|
|
@@ -45,36 +43,3 @@ class forwardoption(metaclass=forwardoptionMetaclass):
|
|
|
45
43
|
def __getattr__(self, key):
|
|
46
44
|
"""Access to a class field"""
|
|
47
45
|
return forwardoption([key])
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
def environment(name: str):
|
|
51
|
-
def annotate(f):
|
|
52
|
-
def callback_env(ctx, name, value):
|
|
53
|
-
if value:
|
|
54
|
-
assert name not in ctx.params, "Environment has already been set"
|
|
55
|
-
else:
|
|
56
|
-
return ctx.params.get(name, None)
|
|
57
|
-
return Environment.get(value)
|
|
58
|
-
|
|
59
|
-
def callback(ctx, param, value):
|
|
60
|
-
if value:
|
|
61
|
-
if name not in ctx.params:
|
|
62
|
-
ctx.params[name] = Environment()
|
|
63
|
-
ctx.params[name].workdir = value
|
|
64
|
-
|
|
65
|
-
f = click.option(
|
|
66
|
-
f"--{name}-workdir",
|
|
67
|
-
type=str,
|
|
68
|
-
callback=callback,
|
|
69
|
-
expose_value=False,
|
|
70
|
-
help="Experimaestro environment",
|
|
71
|
-
)(f)
|
|
72
|
-
f = click.option(
|
|
73
|
-
f"--{name}",
|
|
74
|
-
type=str,
|
|
75
|
-
callback=callback_env,
|
|
76
|
-
help="Experimaestro environment",
|
|
77
|
-
)(f)
|
|
78
|
-
return f
|
|
79
|
-
|
|
80
|
-
return annotate
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import inspect
|
|
2
|
-
import itertools
|
|
3
2
|
import json
|
|
4
3
|
import logging
|
|
5
4
|
import sys
|
|
@@ -12,7 +11,7 @@ import yaml
|
|
|
12
11
|
from experimaestro import LauncherRegistry, RunMode, experiment
|
|
13
12
|
from experimaestro.experiments.configuration import ConfigurationBase
|
|
14
13
|
from experimaestro.exceptions import HandledException
|
|
15
|
-
from experimaestro.settings import
|
|
14
|
+
from experimaestro.settings import get_workspace
|
|
16
15
|
from omegaconf import OmegaConf, SCMode
|
|
17
16
|
from termcolor import cprint
|
|
18
17
|
|
|
@@ -105,11 +104,17 @@ def load(yaml_file: Path):
|
|
|
105
104
|
@click.option(
|
|
106
105
|
"--file", "xp_file", help="The file containing the main experimental code"
|
|
107
106
|
)
|
|
107
|
+
@click.option(
|
|
108
|
+
"--workspace",
|
|
109
|
+
type=str,
|
|
110
|
+
default=None,
|
|
111
|
+
help="Workspace ID (reads from settings.yaml in experimaestro config)",
|
|
112
|
+
)
|
|
108
113
|
@click.option(
|
|
109
114
|
"--workdir",
|
|
110
115
|
type=str,
|
|
111
116
|
default=None,
|
|
112
|
-
help="Working
|
|
117
|
+
help="Working environment",
|
|
113
118
|
)
|
|
114
119
|
@click.option("--conf", "-c", "extra_conf", type=str, multiple=True)
|
|
115
120
|
@click.option(
|
|
@@ -128,6 +133,7 @@ def experiments_cli( # noqa: C901
|
|
|
128
133
|
port: int,
|
|
129
134
|
xpm_config_dir: Path,
|
|
130
135
|
workdir: Optional[Path],
|
|
136
|
+
workspace: Optional[str],
|
|
131
137
|
env: List[Tuple[str, str]],
|
|
132
138
|
run_mode: RunMode,
|
|
133
139
|
extra_conf: List[str],
|
|
@@ -224,26 +230,38 @@ def experiments_cli( # noqa: C901
|
|
|
224
230
|
configuration, structured_config_mode=SCMode.INSTANTIATE
|
|
225
231
|
)
|
|
226
232
|
|
|
227
|
-
#
|
|
228
|
-
settings = get_settings()
|
|
229
|
-
ws_env = {}
|
|
233
|
+
# Define the workspace
|
|
230
234
|
workdir = Path(workdir) if workdir else None
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
235
|
+
|
|
236
|
+
if workspace:
|
|
237
|
+
ws_env = get_workspace(workspace)
|
|
238
|
+
if ws_env is None:
|
|
239
|
+
raise RuntimeError("No workspace named %s", workspace)
|
|
240
|
+
|
|
241
|
+
logging.info("Using workspace %s", ws_env.id)
|
|
242
|
+
if workdir:
|
|
243
|
+
# Overrides working directory
|
|
244
|
+
logging.info(" override working directory: %s", workdir)
|
|
245
|
+
ws_env.path = workdir
|
|
246
|
+
else:
|
|
247
|
+
workdir = ws_env.path
|
|
248
|
+
elif workdir:
|
|
249
|
+
logging.info("Using workdir %s", workdir)
|
|
250
|
+
ws_env = workdir
|
|
251
|
+
else:
|
|
252
|
+
ws_env = get_workspace()
|
|
253
|
+
assert ws_env is not None, "No workdir or workspace defined, and no default"
|
|
254
|
+
logging.info("Using default workspace %s", ws_env.id)
|
|
236
255
|
|
|
237
256
|
logging.info("Using working directory %s", str(workdir.resolve()))
|
|
238
257
|
|
|
239
258
|
# --- Runs the experiment
|
|
240
259
|
with experiment(
|
|
241
|
-
|
|
260
|
+
ws_env, configuration.id, host=host, port=port, run_mode=run_mode
|
|
242
261
|
) as xp:
|
|
243
262
|
# Set up the environment
|
|
244
263
|
# (1) global settings (2) workspace settings and (3) command line settings
|
|
245
|
-
for key, value in
|
|
246
|
-
logging.info("Setting environment: %s=%s", key, value)
|
|
264
|
+
for key, value in env:
|
|
247
265
|
xp.setenv(key, value)
|
|
248
266
|
|
|
249
267
|
try:
|
|
@@ -92,16 +92,26 @@ class TaskRunner:
|
|
|
92
92
|
logger.info("Finished cleanup")
|
|
93
93
|
|
|
94
94
|
def handle_error(self, code, frame_type):
|
|
95
|
-
logger.info("
|
|
95
|
+
logger.info("Error handler: finished with code %d", code)
|
|
96
96
|
self.failedpath.write_text(str(code))
|
|
97
97
|
self.cleanup()
|
|
98
98
|
logger.info("Exiting")
|
|
99
|
-
|
|
99
|
+
sys.exit(1)
|
|
100
100
|
|
|
101
101
|
def run(self):
|
|
102
102
|
atexit.register(self.cleanup)
|
|
103
|
-
signal.signal(signal.SIGTERM, self.handle_error)
|
|
104
|
-
signal.signal(signal.SIGINT, self.handle_error)
|
|
103
|
+
sigterm_handler = signal.signal(signal.SIGTERM, self.handle_error)
|
|
104
|
+
sigint_handler = signal.signal(signal.SIGINT, self.handle_error)
|
|
105
|
+
|
|
106
|
+
def remove_signal_handlers(remove_cleanup=True):
|
|
107
|
+
"""Removes cleanup in forked processes"""
|
|
108
|
+
signal.signal(signal.SIGTERM, sigterm_handler)
|
|
109
|
+
signal.signal(signal.SIGINT, sigint_handler)
|
|
110
|
+
atexit.unregister(self.cleanup)
|
|
111
|
+
|
|
112
|
+
if sys.platform != "win32":
|
|
113
|
+
os.register_at_fork(after_in_child=remove_signal_handlers)
|
|
114
|
+
|
|
105
115
|
try:
|
|
106
116
|
workdir = self.scriptpath.parent
|
|
107
117
|
os.chdir(workdir)
|
|
@@ -129,14 +139,23 @@ class TaskRunner:
|
|
|
129
139
|
self.started = True
|
|
130
140
|
run(workdir / "params.json")
|
|
131
141
|
|
|
142
|
+
# ... remove the handlers
|
|
143
|
+
logger.info("Task ended successfully")
|
|
144
|
+
remove_signal_handlers(remove_cleanup=False)
|
|
145
|
+
|
|
132
146
|
# Everything went OK
|
|
133
|
-
|
|
147
|
+
sys.exit(0)
|
|
134
148
|
except Exception:
|
|
135
149
|
logger.exception("Got exception while running")
|
|
136
150
|
self.handle_error(1, None)
|
|
137
151
|
|
|
138
152
|
except SystemExit as e:
|
|
139
153
|
if e.code == 0:
|
|
154
|
+
# Normal exit, just create the ".done" file
|
|
140
155
|
self.donepath.touch()
|
|
156
|
+
|
|
157
|
+
# ... and finish the exit process
|
|
158
|
+
logger.info("This is the end (TODO: remove this line)")
|
|
159
|
+
raise
|
|
141
160
|
else:
|
|
142
161
|
self.handle_error(e.code, None)
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
from collections import ChainMap
|
|
2
2
|
from functools import cached_property
|
|
3
|
+
import logging
|
|
3
4
|
import os
|
|
4
5
|
from pathlib import Path
|
|
5
6
|
from shutil import rmtree
|
|
@@ -13,13 +14,12 @@ from experimaestro.exceptions import HandledException
|
|
|
13
14
|
from experimaestro.notifications import LevelInformation, Reporter
|
|
14
15
|
from typing import Dict
|
|
15
16
|
from experimaestro.scheduler.services import Service
|
|
16
|
-
from experimaestro.settings import get_settings
|
|
17
|
+
from experimaestro.settings import WorkspaceSettings, get_settings
|
|
17
18
|
|
|
18
19
|
|
|
19
20
|
from experimaestro.core.objects import Config, ConfigWalkContext
|
|
20
21
|
from experimaestro.utils import logger
|
|
21
22
|
from experimaestro.locking import Locks, LockError, Lock
|
|
22
|
-
from .environment import Environment
|
|
23
23
|
from .workspace import RunMode, Workspace
|
|
24
24
|
from .dependencies import Dependency, DependencyStatus, Resource
|
|
25
25
|
import concurrent.futures
|
|
@@ -180,7 +180,7 @@ class Job(Resource):
|
|
|
180
180
|
return ChainMap(
|
|
181
181
|
{},
|
|
182
182
|
self.launcher.environ if self.launcher else {},
|
|
183
|
-
self.workspace.
|
|
183
|
+
self.workspace.env if self.workspace else {},
|
|
184
184
|
)
|
|
185
185
|
|
|
186
186
|
@property
|
|
@@ -508,6 +508,12 @@ class Scheduler:
|
|
|
508
508
|
job.scheduler = self
|
|
509
509
|
self.waitingjobs.add(job)
|
|
510
510
|
|
|
511
|
+
# Check that we don't have a completed job in
|
|
512
|
+
# alternate directories
|
|
513
|
+
for jobspath in experiment.current().alt_jobspaths:
|
|
514
|
+
# FIXME: check if done
|
|
515
|
+
pass
|
|
516
|
+
|
|
511
517
|
# Creates a link into the experiment folder
|
|
512
518
|
path = experiment.current().jobspath / job.relpath
|
|
513
519
|
path.parent.mkdir(parents=True, exist_ok=True)
|
|
@@ -719,7 +725,7 @@ class experiment:
|
|
|
719
725
|
```
|
|
720
726
|
"""
|
|
721
727
|
|
|
722
|
-
|
|
728
|
+
#: Current experiment
|
|
723
729
|
CURRENT: Optional["experiment"] = None
|
|
724
730
|
|
|
725
731
|
@staticmethod
|
|
@@ -733,7 +739,7 @@ class experiment:
|
|
|
733
739
|
|
|
734
740
|
def __init__(
|
|
735
741
|
self,
|
|
736
|
-
env: Union[Path, str,
|
|
742
|
+
env: Union[Path, str, WorkspaceSettings],
|
|
737
743
|
name: str,
|
|
738
744
|
*,
|
|
739
745
|
host: Optional[str] = None,
|
|
@@ -761,16 +767,13 @@ class experiment:
|
|
|
761
767
|
|
|
762
768
|
from experimaestro.server import Server
|
|
763
769
|
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
self.environment = Environment(workdir=env)
|
|
770
|
+
settings = get_settings()
|
|
771
|
+
if not isinstance(env, WorkspaceSettings):
|
|
772
|
+
env = WorkspaceSettings(id=None, path=Path(env))
|
|
768
773
|
|
|
769
774
|
# Creates the workspace
|
|
770
775
|
run_mode = run_mode or RunMode.NORMAL
|
|
771
|
-
self.workspace = Workspace(
|
|
772
|
-
self.environment, launcher=launcher, run_mode=run_mode
|
|
773
|
-
)
|
|
776
|
+
self.workspace = Workspace(settings, env, launcher=launcher, run_mode=run_mode)
|
|
774
777
|
|
|
775
778
|
# Mark the directory has an experimaestro folder
|
|
776
779
|
self.workdir = self.workspace.experimentspath / name
|
|
@@ -780,7 +783,7 @@ class experiment:
|
|
|
780
783
|
self.old_experiment = None
|
|
781
784
|
self.services: Dict[str, Service] = {}
|
|
782
785
|
|
|
783
|
-
|
|
786
|
+
# Get configuration settings
|
|
784
787
|
|
|
785
788
|
if host is not None:
|
|
786
789
|
settings.server.host = host
|
|
@@ -800,6 +803,11 @@ class experiment:
|
|
|
800
803
|
else None
|
|
801
804
|
)
|
|
802
805
|
|
|
806
|
+
# Copy environment variable from main (but do not
|
|
807
|
+
# override)
|
|
808
|
+
for key, value in settings.env.items():
|
|
809
|
+
self.environment.setenv(key, value, override=False)
|
|
810
|
+
|
|
803
811
|
if os.environ.get("XPM_ENABLEFAULTHANDLER", "0") == "1":
|
|
804
812
|
import faulthandler
|
|
805
813
|
|
|
@@ -832,6 +840,12 @@ class experiment:
|
|
|
832
840
|
"""Return the directory in which results can be stored for this experiment"""
|
|
833
841
|
return self.workdir / "jobs"
|
|
834
842
|
|
|
843
|
+
@property
|
|
844
|
+
def alt_jobspaths(self):
|
|
845
|
+
"""Return potential other directories"""
|
|
846
|
+
for alt_workdir in self.workspace.alt_workdirs:
|
|
847
|
+
yield alt_workdir / "jobs"
|
|
848
|
+
|
|
835
849
|
@property
|
|
836
850
|
def jobsbakpath(self):
|
|
837
851
|
"""Return the directory in which results can be stored for this experiment"""
|
|
@@ -876,9 +890,11 @@ class experiment:
|
|
|
876
890
|
future = asyncio.run_coroutine_threadsafe(awaitcompletion(), self.loop)
|
|
877
891
|
return future.result()
|
|
878
892
|
|
|
879
|
-
def setenv(self, name, value):
|
|
893
|
+
def setenv(self, name, value, override=True):
|
|
880
894
|
"""Shortcut to set the environment value"""
|
|
881
|
-
self.
|
|
895
|
+
if override or name not in self.workspace.env:
|
|
896
|
+
logging.info("Setting environment: %s=%s", name, value)
|
|
897
|
+
self.worskpace.env[name] = value
|
|
882
898
|
|
|
883
899
|
def token(self, name: str, count: int):
|
|
884
900
|
"""Returns a token for this experiment
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
+
from collections import ChainMap
|
|
1
2
|
from enum import Enum
|
|
3
|
+
from functools import cached_property
|
|
2
4
|
from pathlib import Path
|
|
3
|
-
from typing import Optional
|
|
4
|
-
|
|
5
|
-
if TYPE_CHECKING:
|
|
6
|
-
from experimaestro.scheduler.environment import Environment
|
|
5
|
+
from typing import Optional
|
|
6
|
+
from experimaestro.settings import WorkspaceSettings, Settings
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
class RunMode(str, Enum):
|
|
@@ -25,15 +25,22 @@ class Workspace:
|
|
|
25
25
|
"""
|
|
26
26
|
|
|
27
27
|
CURRENT = None
|
|
28
|
-
|
|
28
|
+
settings: "Settings"
|
|
29
|
+
worspace: "WorkspaceSettings"
|
|
29
30
|
|
|
30
31
|
"""Creates a workspace for experiments"""
|
|
31
32
|
|
|
32
33
|
def __init__(
|
|
33
|
-
self,
|
|
34
|
+
self,
|
|
35
|
+
settings: "Settings",
|
|
36
|
+
workspace_settings: "WorkspaceSettings",
|
|
37
|
+
launcher=None,
|
|
38
|
+
run_mode: RunMode = None,
|
|
34
39
|
):
|
|
35
|
-
self.
|
|
36
|
-
|
|
40
|
+
self.settings = settings
|
|
41
|
+
self.workspace_settings = workspace_settings
|
|
42
|
+
|
|
43
|
+
path = self.workspace_settings.path
|
|
37
44
|
self.notificationURL: Optional[str] = None
|
|
38
45
|
if isinstance(path, Path):
|
|
39
46
|
path = path.absolute()
|
|
@@ -43,6 +50,8 @@ class Workspace:
|
|
|
43
50
|
|
|
44
51
|
self.launcher = launcher or Launcher.get(path)
|
|
45
52
|
|
|
53
|
+
self.env = ChainMap({}, workspace_settings.env, settings.env)
|
|
54
|
+
|
|
46
55
|
def __enter__(self):
|
|
47
56
|
self.old_workspace = Workspace.CURRENT
|
|
48
57
|
Workspace.CURRENT = self
|
|
@@ -50,6 +59,15 @@ class Workspace:
|
|
|
50
59
|
def __exit__(self, *args):
|
|
51
60
|
Workspace.CURRENT = self.old_workspace
|
|
52
61
|
|
|
62
|
+
@cached_property
|
|
63
|
+
def alt_workspaces(self):
|
|
64
|
+
for ws_id in self.workspace_settings.alt_workspaces:
|
|
65
|
+
yield self.settings.workspaces[ws_id]
|
|
66
|
+
|
|
67
|
+
@property
|
|
68
|
+
def alt_workdirs(self):
|
|
69
|
+
yield from map(lambda ws: ws.path, self.workspace_settings.alt_workspaces)
|
|
70
|
+
|
|
53
71
|
@property
|
|
54
72
|
def connector(self):
|
|
55
73
|
"""Returns the default connector"""
|
|
@@ -92,7 +92,11 @@ class PythonScriptBuilder:
|
|
|
92
92
|
with scriptpath.open("wt") as out:
|
|
93
93
|
out.write("#!{}\n".format(self.pythonpath))
|
|
94
94
|
out.write("# Experimaestro generated task\n\n")
|
|
95
|
-
out.write(
|
|
95
|
+
out.write(
|
|
96
|
+
"""import logging\n"""
|
|
97
|
+
"""logging.basicConfig(level=logging.INFO, """
|
|
98
|
+
"""format='%(levelname)s:%(process)d:%(asctime)s [%(name)s] %(message)s', datefmt='%y-%m-%d %H:%M:%S')\n\n"""
|
|
99
|
+
)
|
|
96
100
|
|
|
97
101
|
out.write("\nif __name__ == '__main__':\n\n" "")
|
|
98
102
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import os
|
|
2
|
-
from omegaconf import OmegaConf
|
|
2
|
+
from omegaconf import OmegaConf, SCMode
|
|
3
3
|
from dataclasses import field, dataclass
|
|
4
4
|
from functools import lru_cache
|
|
5
5
|
from pathlib import Path
|
|
@@ -23,15 +23,23 @@ class ServerSettings:
|
|
|
23
23
|
|
|
24
24
|
@dataclass
|
|
25
25
|
class WorkspaceSettings:
|
|
26
|
+
"""Defines the workspace"""
|
|
27
|
+
|
|
26
28
|
id: str
|
|
27
29
|
"""The workspace identifier"""
|
|
28
30
|
|
|
29
|
-
path: Path
|
|
31
|
+
path: Path = field()
|
|
30
32
|
"""The workspace path"""
|
|
31
33
|
|
|
32
34
|
env: Dict[str, str] = field(default_factory=dict)
|
|
33
35
|
"""Workspace specific environment variables"""
|
|
34
36
|
|
|
37
|
+
alt_workspaces: List[str] = field(default_factory=list)
|
|
38
|
+
"""Alternative workspaces to find jobs or experiments"""
|
|
39
|
+
|
|
40
|
+
def __post_init__(self):
|
|
41
|
+
self.path = self.path.expanduser().resolve()
|
|
42
|
+
|
|
35
43
|
|
|
36
44
|
@dataclass
|
|
37
45
|
class Settings:
|
|
@@ -51,13 +59,15 @@ def get_settings(path: Optional[Path] = None) -> Settings:
|
|
|
51
59
|
|
|
52
60
|
path = path or Path("~/.config/experimaestro/settings.yaml").expanduser()
|
|
53
61
|
if not path.is_file():
|
|
54
|
-
return schema
|
|
62
|
+
return schema.to_object()
|
|
55
63
|
|
|
56
64
|
conf = OmegaConf.load(path)
|
|
57
|
-
return OmegaConf.
|
|
65
|
+
return OmegaConf.to_container(
|
|
66
|
+
OmegaConf.merge(schema, conf), structured_config_mode=SCMode.INSTANTIATE
|
|
67
|
+
)
|
|
58
68
|
|
|
59
69
|
|
|
60
|
-
def get_workspace(id: Optional[str]) -> WorkspaceSettings:
|
|
70
|
+
def get_workspace(id: Optional[str] = None) -> Optional[WorkspaceSettings]:
|
|
61
71
|
"""Return the workspace settings given an id (or None for the default one)"""
|
|
62
72
|
workspaces = get_settings().workspaces
|
|
63
73
|
if workspaces:
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
"""Defines an experimental environment"""
|
|
2
|
-
|
|
3
|
-
from pathlib import Path
|
|
4
|
-
from typing import Dict
|
|
5
|
-
import marshmallow as mm
|
|
6
|
-
from experimaestro.utils.settings import JsonSettings
|
|
7
|
-
from pytools import memoize
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
def schema(schema_cls):
|
|
11
|
-
def annotate(object_cls):
|
|
12
|
-
schema_cls.OBJECT_CLS = object_cls
|
|
13
|
-
object_cls.SCHEMA = schema_cls
|
|
14
|
-
return object_cls
|
|
15
|
-
|
|
16
|
-
return annotate
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class _Schema(mm.Schema):
|
|
20
|
-
@mm.post_load
|
|
21
|
-
def make_settings(self, data, **kwargs):
|
|
22
|
-
settings = self.__class__.OBJECT_CLS()
|
|
23
|
-
for key, value in data.items():
|
|
24
|
-
setattr(settings, key, value)
|
|
25
|
-
return settings
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
class EnvironmentSchema(_Schema):
|
|
29
|
-
hostname = mm.fields.Str()
|
|
30
|
-
"""The hostname (can be empty for localhost)"""
|
|
31
|
-
|
|
32
|
-
pythonpath = mm.fields.Str()
|
|
33
|
-
"""Path to python executable"""
|
|
34
|
-
workdir = mm.fields.Str()
|
|
35
|
-
environ = mm.fields.Dict(keys=mm.fields.Str(), values=mm.fields.Str())
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
class Schema(_Schema):
|
|
39
|
-
environments = mm.fields.Dict(
|
|
40
|
-
keys=mm.fields.Str(), values=mm.fields.Nested(EnvironmentSchema)
|
|
41
|
-
)
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
@schema(Schema)
|
|
45
|
-
class Settings(JsonSettings):
|
|
46
|
-
"""User settings"""
|
|
47
|
-
|
|
48
|
-
def __init__(self):
|
|
49
|
-
self.environments: Dict[str, str] = {}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
@schema(EnvironmentSchema)
|
|
53
|
-
class Environment:
|
|
54
|
-
"""This defines the environment for an experiment, and can be stored"""
|
|
55
|
-
|
|
56
|
-
def __init__(self, workdir=None):
|
|
57
|
-
self.hostname = None
|
|
58
|
-
self._workdir = workdir
|
|
59
|
-
self.pythonpath = None
|
|
60
|
-
self.environ = {}
|
|
61
|
-
|
|
62
|
-
@property
|
|
63
|
-
def basepath(self):
|
|
64
|
-
if self.hostname:
|
|
65
|
-
from ..connectors.ssh import SshPath
|
|
66
|
-
|
|
67
|
-
return SshPath(f"ssh://{self.hostname}")
|
|
68
|
-
return Path()
|
|
69
|
-
|
|
70
|
-
@property
|
|
71
|
-
def workdir(self) -> Path:
|
|
72
|
-
assert self._workdir, "The working directory has not been set"
|
|
73
|
-
return self.basepath / self._workdir
|
|
74
|
-
|
|
75
|
-
@workdir.setter
|
|
76
|
-
def workdir(self, value):
|
|
77
|
-
self._workdir = value
|
|
78
|
-
|
|
79
|
-
def setenv(self, key: str, value: str):
|
|
80
|
-
"""Set the environment variable with key"""
|
|
81
|
-
self.environ[key] = value
|
|
82
|
-
|
|
83
|
-
@staticmethod
|
|
84
|
-
@memoize()
|
|
85
|
-
def _load():
|
|
86
|
-
path = (
|
|
87
|
-
Path("~").expanduser() / ".config" / "experimaestro" / "environments.json"
|
|
88
|
-
)
|
|
89
|
-
return Settings.load(path)
|
|
90
|
-
|
|
91
|
-
@staticmethod
|
|
92
|
-
def get(name: str):
|
|
93
|
-
"""Retrieve an environment by name"""
|
|
94
|
-
return Environment._load().environments[name]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/launchers/slurm/configuration.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/016b4a6cdced82ab3aa1.ttf
RENAMED
|
File without changes
|
{experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/0c35d18bf06992036b69.woff2
RENAMED
|
File without changes
|
{experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/219aa9140e099e6c72ed.woff2
RENAMED
|
File without changes
|
{experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/3a4004a46a653d4b2166.woff
RENAMED
|
File without changes
|
{experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/3baa5b8f3469222b822d.woff
RENAMED
|
File without changes
|
{experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/4d73cb90e394b34b7670.woff
RENAMED
|
File without changes
|
{experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/4ef4218c522f1eb6b5b1.woff2
RENAMED
|
File without changes
|
{experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/50701fbb8177c2dde530.ttf
RENAMED
|
File without changes
|
{experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/5d681e2edae8c60630db.woff
RENAMED
|
File without changes
|
{experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/6f420cf17cc0d7676fad.woff2
RENAMED
|
File without changes
|
{experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/878f31251d960bd6266f.woff2
RENAMED
|
File without changes
|
{experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/b041b1fa4fe241b23445.woff2
RENAMED
|
File without changes
|
{experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/b6879d41b0852f01ed5b.woff2
RENAMED
|
File without changes
|
{experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/c380809fd3677d7d6903.woff2
RENAMED
|
File without changes
|
{experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/d75e3fd1eb12e9bd6655.ttf
RENAMED
|
File without changes
|
{experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/server/data/f882956fd323fd322f31.woff
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/sphinx/static/experimaestro.css
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/connectors/bin/executable.py
RENAMED
|
File without changes
|
{experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/connectors/test_local.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{experimaestro-1.5.3 → experimaestro-1.5.5}/src/experimaestro/tests/scripts/notifyandwait.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|