hpc-runner 0.3.1__tar.gz → 0.3.2__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.
Files changed (96) hide show
  1. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/.github/workflows/ci.yml +3 -0
  2. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/PKG-INFO +1 -1
  3. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/_version.py +2 -2
  4. hpc_runner-0.3.2/tests/modulefiles/dummy_lib/2.5 +4 -0
  5. hpc_runner-0.3.2/tests/modulefiles/dummy_tool/1.0 +4 -0
  6. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/tests/test_schedulers/test_local.py +67 -1
  7. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/.github/workflows/docs.yml +0 -0
  8. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/.github/workflows/publish.yml +0 -0
  9. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/.gitignore +0 -0
  10. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/.pre-commit-config.yaml +0 -0
  11. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/CLAUDE.md +0 -0
  12. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/README.md +0 -0
  13. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/defaults/config.toml +0 -0
  14. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/docs/HPC_MONITOR_TUI_PLAN.md +0 -0
  15. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/docs/Makefile +0 -0
  16. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/docs/TEXTUAL_STYLING_COOKBOOK.md +0 -0
  17. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/docs/source/_static/.gitkeep +0 -0
  18. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/docs/source/_templates/.gitkeep +0 -0
  19. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/docs/source/cli.rst +0 -0
  20. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/docs/source/conf.py +0 -0
  21. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/docs/source/configuration.rst +0 -0
  22. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/docs/source/getting_started.rst +0 -0
  23. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/docs/source/index.rst +0 -0
  24. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/docs/source/programmatic_api.rst +0 -0
  25. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/docs/source/sge.rst +0 -0
  26. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/pyproject.toml +0 -0
  27. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/sourceme +0 -0
  28. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/__init__.py +0 -0
  29. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/cli/__init__.py +0 -0
  30. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/cli/cancel.py +0 -0
  31. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/cli/config.py +0 -0
  32. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/cli/main.py +0 -0
  33. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/cli/monitor.py +0 -0
  34. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/cli/run.py +0 -0
  35. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/cli/status.py +0 -0
  36. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/cli/submit.py +0 -0
  37. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/core/__init__.py +0 -0
  38. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/core/config.py +0 -0
  39. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/core/descriptors.py +0 -0
  40. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/core/exceptions.py +0 -0
  41. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/core/job.py +0 -0
  42. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/core/job_array.py +0 -0
  43. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/core/job_info.py +0 -0
  44. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/core/resources.py +0 -0
  45. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/core/result.py +0 -0
  46. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/core/types.py +0 -0
  47. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/py.typed +0 -0
  48. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/schedulers/__init__.py +0 -0
  49. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/schedulers/base.py +0 -0
  50. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/schedulers/detection.py +0 -0
  51. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/schedulers/local/__init__.py +0 -0
  52. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/schedulers/local/scheduler.py +0 -0
  53. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/schedulers/local/templates/job.sh.j2 +0 -0
  54. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/schedulers/sge/__init__.py +0 -0
  55. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/schedulers/sge/args.py +0 -0
  56. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/schedulers/sge/parser.py +0 -0
  57. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/schedulers/sge/scheduler.py +0 -0
  58. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/schedulers/sge/templates/batch.sh.j2 +0 -0
  59. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/schedulers/sge/templates/interactive.sh.j2 +0 -0
  60. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/templates/__init__.py +0 -0
  61. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/templates/engine.py +0 -0
  62. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/tui/__init__.py +0 -0
  63. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/tui/app.py +0 -0
  64. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/tui/components/__init__.py +0 -0
  65. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/tui/components/detail_panel.py +0 -0
  66. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/tui/components/filter_bar.py +0 -0
  67. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/tui/components/filter_popup.py +0 -0
  68. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/tui/components/job_table.py +0 -0
  69. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/tui/providers/__init__.py +0 -0
  70. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/tui/providers/jobs.py +0 -0
  71. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/tui/screens/__init__.py +0 -0
  72. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/tui/screens/confirm.py +0 -0
  73. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/tui/screens/job_details.py +0 -0
  74. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/tui/screens/log_viewer.py +0 -0
  75. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/tui/snapshot.py +0 -0
  76. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/tui/styles/monitor.tcss +0 -0
  77. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/workflow/__init__.py +0 -0
  78. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/workflow/dependency.py +0 -0
  79. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/src/hpc_runner/workflow/pipeline.py +0 -0
  80. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/tests/__init__.py +0 -0
  81. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/tests/conftest.py +0 -0
  82. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/tests/test_cli/__init__.py +0 -0
  83. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/tests/test_cli/test_run.py +0 -0
  84. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/tests/test_core/__init__.py +0 -0
  85. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/tests/test_core/test_config.py +0 -0
  86. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/tests/test_core/test_job.py +0 -0
  87. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/tests/test_core/test_resources.py +0 -0
  88. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/tests/test_schedulers/__init__.py +0 -0
  89. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/tests/test_schedulers/test_detection.py +0 -0
  90. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/tests/test_schedulers/test_sge.py +0 -0
  91. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/tests/test_tui/__init__.py +0 -0
  92. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/tests/test_tui/test_app_snapshot.py +0 -0
  93. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/tests/test_tui/test_detail_panel.py +0 -0
  94. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/tests/test_tui/test_job_table.py +0 -0
  95. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/tests/test_workflow/__init__.py +0 -0
  96. {hpc_runner-0.3.1 → hpc_runner-0.3.2}/tests/test_workflow/test_pipeline.py +0 -0
@@ -47,6 +47,9 @@ jobs:
47
47
  with:
48
48
  python-version: ${{ matrix.python-version }}
49
49
 
50
+ - name: Install environment-modules
51
+ run: sudo apt-get update && sudo apt-get install -y environment-modules
52
+
50
53
  - name: Install dependencies
51
54
  run: pip install -e ".[dev]"
52
55
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hpc-runner
3
- Version: 0.3.1
3
+ Version: 0.3.2
4
4
  Summary: Unified HPC job submission across multiple schedulers
5
5
  Project-URL: Homepage, https://github.com/sjalloq/hpc-runner
6
6
  Project-URL: Repository, https://github.com/sjalloq/hpc-runner
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.3.1'
32
- __version_tuple__ = version_tuple = (0, 3, 1)
31
+ __version__ = version = '0.3.2'
32
+ __version_tuple__ = version_tuple = (0, 3, 2)
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -0,0 +1,4 @@
1
+ #%Module
2
+ module-whatis "Dummy library v2.5 for testing"
3
+ setenv DUMMY_LIB_VERSION 2.5
4
+ setenv DUMMY_LIB_LOADED true
@@ -0,0 +1,4 @@
1
+ #%Module
2
+ module-whatis "Dummy tool v1.0 for testing"
3
+ setenv DUMMY_TOOL_VERSION 1.0
4
+ setenv DUMMY_TOOL_LOADED true
@@ -1,6 +1,6 @@
1
1
  """Tests for local scheduler."""
2
2
 
3
- import time
3
+ import shutil
4
4
  from pathlib import Path
5
5
 
6
6
  import pytest
@@ -9,6 +9,15 @@ from hpc_runner.core.job import Job
9
9
  from hpc_runner.core.result import JobStatus
10
10
  from hpc_runner.schedulers.local import LocalScheduler
11
11
 
12
+ MODULEFILES_DIR = str(Path(__file__).parent.parent / "modulefiles")
13
+
14
+ has_modules = (
15
+ shutil.which("modulecmd") is not None
16
+ or Path("/usr/share/Modules/init/bash").exists()
17
+ or Path("/etc/profile.d/modules.sh").exists()
18
+ )
19
+ requires_modules = pytest.mark.skipif(not has_modules, reason="Environment Modules not installed")
20
+
12
21
 
13
22
  class TestLocalScheduler:
14
23
  """Tests for LocalScheduler."""
@@ -151,3 +160,60 @@ class TestLocalScheduler:
151
160
  assert "module use /opt/modulefiles" in script
152
161
  assert "module load python/3.11" in script
153
162
  assert "module load gcc/12.2" in script
163
+
164
+ @requires_modules
165
+ def test_module_loading(self, temp_dir):
166
+ """Test that a module is actually loaded and sets env vars."""
167
+ scheduler = LocalScheduler()
168
+ job = Job(
169
+ command="echo $DUMMY_TOOL_LOADED",
170
+ modules=["dummy_tool/1.0"],
171
+ modules_path=[MODULEFILES_DIR],
172
+ workdir=temp_dir,
173
+ stdout="out.log",
174
+ )
175
+
176
+ result = scheduler.submit(job, interactive=True)
177
+
178
+ assert result.returncode == 0
179
+ stdout_path = scheduler.get_output_path(result.job_id, "stdout")
180
+ content = stdout_path.read_text().strip()
181
+ assert content == "true"
182
+
183
+ @requires_modules
184
+ def test_multiple_modules(self, temp_dir):
185
+ """Test loading multiple modules sets all env vars."""
186
+ scheduler = LocalScheduler()
187
+ job = Job(
188
+ command="echo $DUMMY_TOOL_LOADED $DUMMY_LIB_LOADED",
189
+ modules=["dummy_tool/1.0", "dummy_lib/2.5"],
190
+ modules_path=[MODULEFILES_DIR],
191
+ workdir=temp_dir,
192
+ stdout="out.log",
193
+ )
194
+
195
+ result = scheduler.submit(job, interactive=True)
196
+
197
+ assert result.returncode == 0
198
+ stdout_path = scheduler.get_output_path(result.job_id, "stdout")
199
+ content = stdout_path.read_text().strip()
200
+ assert content == "true true"
201
+
202
+ @requires_modules
203
+ def test_module_sets_env_var(self, temp_dir):
204
+ """Test that module sets specific version string in environment."""
205
+ scheduler = LocalScheduler()
206
+ job = Job(
207
+ command="echo $DUMMY_TOOL_VERSION",
208
+ modules=["dummy_tool/1.0"],
209
+ modules_path=[MODULEFILES_DIR],
210
+ workdir=temp_dir,
211
+ stdout="out.log",
212
+ )
213
+
214
+ result = scheduler.submit(job, interactive=True)
215
+
216
+ assert result.returncode == 0
217
+ stdout_path = scheduler.get_output_path(result.job_id, "stdout")
218
+ content = stdout_path.read_text().strip()
219
+ assert content == "1.0"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes