hypershell 2.7.0__tar.gz → 2.7.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 (181) hide show
  1. hypershell-2.7.2/.github/FUNDING.yml +12 -0
  2. hypershell-2.7.2/.github/workflows/publish.yml +19 -0
  3. hypershell-2.7.2/.github/workflows/tests.yml +24 -0
  4. {hypershell-2.7.0 → hypershell-2.7.2}/Apptainer +1 -1
  5. {hypershell-2.7.0 → hypershell-2.7.2}/Dockerfile +1 -1
  6. {hypershell-2.7.0 → hypershell-2.7.2}/PKG-INFO +10 -5
  7. {hypershell-2.7.0 → hypershell-2.7.2}/README.rst +8 -4
  8. hypershell-2.7.2/docs/_include/config_desc.rst +1 -0
  9. hypershell-2.7.2/docs/_include/config_help.rst +26 -0
  10. hypershell-2.7.2/docs/_include/config_usage.rst +9 -0
  11. {hypershell-2.7.0 → hypershell-2.7.2}/docs/blog/index.rst +1 -0
  12. hypershell-2.7.2/docs/cli/config.rst +18 -0
  13. {hypershell-2.7.0 → hypershell-2.7.2}/docs/cli/index.rst +1 -0
  14. {hypershell-2.7.0 → hypershell-2.7.2}/docs/conf.py +1 -1
  15. {hypershell-2.7.0 → hypershell-2.7.2}/docs/getting_started.rst +5 -5
  16. {hypershell-2.7.0 → hypershell-2.7.2}/docs/index.rst +8 -0
  17. hypershell-2.7.2/docs/install.rst +322 -0
  18. {hypershell-2.7.0 → hypershell-2.7.2}/pyproject.toml +12 -2
  19. {hypershell-2.7.0 → hypershell-2.7.2}/share/bash_completion.d/hs +1 -1
  20. {hypershell-2.7.0 → hypershell-2.7.2}/share/man/man1/hs.1 +1 -1
  21. {hypershell-2.7.0 → hypershell-2.7.2}/share/man/man1/hsx.1 +1 -1
  22. {hypershell-2.7.0 → hypershell-2.7.2}/share/man/man1/hyper-shell.1 +1 -1
  23. {hypershell-2.7.0 → hypershell-2.7.2}/src/hypershell/__init__.py +7 -1
  24. {hypershell-2.7.0 → hypershell-2.7.2}/src/hypershell/config.py +22 -21
  25. {hypershell-2.7.0 → hypershell-2.7.2}/src/hypershell/data/__init__.py +1 -1
  26. {hypershell-2.7.0 → hypershell-2.7.2}/src/hypershell/submit.py +5 -4
  27. {hypershell-2.7.0 → hypershell-2.7.2}/src/hypershell/task.py +8 -8
  28. hypershell-2.7.2/tests/__init__.py +75 -0
  29. hypershell-2.7.2/tests/conftest.py +27 -0
  30. hypershell-2.7.2/tests/test_cluster.py +184 -0
  31. hypershell-2.7.2/tests/test_initdb.py +82 -0
  32. hypershell-2.7.2/tests/test_main.py +179 -0
  33. hypershell-2.7.2/tests/test_server.py +102 -0
  34. hypershell-2.7.2/tests/test_submit.py +214 -0
  35. {hypershell-2.7.0 → hypershell-2.7.2}/uv.lock +25 -1
  36. hypershell-2.7.0/docs/_static/logo.svg +0 -19
  37. hypershell-2.7.0/docs/install.rst +0 -167
  38. hypershell-2.7.0/share/zsh/site-functions/_hs +0 -81
  39. hypershell-2.7.0/tests/__init__.py +0 -4
  40. hypershell-2.7.0/tests/unit/__init__.py +0 -4
  41. hypershell-2.7.0/tests/unit/core/__init__.py +0 -2
  42. {hypershell-2.7.0 → hypershell-2.7.2}/.dockerignore +0 -0
  43. {hypershell-2.7.0 → hypershell-2.7.2}/.gitignore +0 -0
  44. {hypershell-2.7.0 → hypershell-2.7.2}/.readthedocs.yaml +0 -0
  45. {hypershell-2.7.0 → hypershell-2.7.2}/CODE_OF_CONDUCT.md +0 -0
  46. {hypershell-2.7.0 → hypershell-2.7.2}/LICENSE +0 -0
  47. {hypershell-2.7.0 → hypershell-2.7.2}/docs/Makefile +0 -0
  48. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/citation.rst +0 -0
  49. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/client_desc.rst +0 -0
  50. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/client_help.rst +0 -0
  51. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/client_usage.rst +0 -0
  52. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/cluster_desc.rst +0 -0
  53. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/cluster_help.rst +0 -0
  54. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/cluster_usage.rst +0 -0
  55. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/config_edit_desc.rst +0 -0
  56. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/config_edit_help.rst +0 -0
  57. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/config_edit_usage.rst +0 -0
  58. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/config_get_desc.rst +0 -0
  59. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/config_get_help.rst +0 -0
  60. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/config_get_usage.rst +0 -0
  61. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/config_intro.rst +0 -0
  62. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/config_intro_alt.rst +0 -0
  63. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/config_param_ref.rst +0 -0
  64. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/config_pythonpath.rst +0 -0
  65. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/config_set_desc.rst +0 -0
  66. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/config_set_help.rst +0 -0
  67. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/config_set_usage.rst +0 -0
  68. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/config_site_vars.rst +0 -0
  69. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/config_task_env.rst +0 -0
  70. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/config_task_env_alt.rst +0 -0
  71. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/config_which_desc.rst +0 -0
  72. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/config_which_help.rst +0 -0
  73. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/config_which_usage.rst +0 -0
  74. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/database.rst +0 -0
  75. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/database_alt.rst +0 -0
  76. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/desc.rst +0 -0
  77. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/exit_status.rst +0 -0
  78. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/initdb_desc.rst +0 -0
  79. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/initdb_help.rst +0 -0
  80. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/initdb_usage.rst +0 -0
  81. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/license.rst +0 -0
  82. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/server_desc.rst +0 -0
  83. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/server_help.rst +0 -0
  84. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/server_usage.rst +0 -0
  85. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/signals.rst +0 -0
  86. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/submit_desc.rst +0 -0
  87. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/submit_help.rst +0 -0
  88. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/submit_usage.rst +0 -0
  89. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/task_info_desc.rst +0 -0
  90. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/task_info_help.rst +0 -0
  91. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/task_info_usage.rst +0 -0
  92. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/task_run_desc.rst +0 -0
  93. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/task_run_help.rst +0 -0
  94. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/task_run_usage.rst +0 -0
  95. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/task_search_desc.rst +0 -0
  96. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/task_search_help.rst +0 -0
  97. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/task_search_usage.rst +0 -0
  98. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/task_submit_desc.rst +0 -0
  99. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/task_submit_help.rst +0 -0
  100. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/task_submit_usage.rst +0 -0
  101. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/task_update_desc.rst +0 -0
  102. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/task_update_help.rst +0 -0
  103. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/task_update_usage.rst +0 -0
  104. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/task_wait_desc.rst +0 -0
  105. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/task_wait_help.rst +0 -0
  106. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/task_wait_usage.rst +0 -0
  107. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/templates.rst +0 -0
  108. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_include/templates_alt.rst +0 -0
  109. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_static/custom.css +0 -0
  110. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_static/logo-dark-mode.png +0 -0
  111. {hypershell-2.7.0 → hypershell-2.7.2}/docs/_static/logo-light-mode.png +0 -0
  112. {hypershell-2.7.0 → hypershell-2.7.2}/docs/api/client.rst +0 -0
  113. {hypershell-2.7.0 → hypershell-2.7.2}/docs/api/cluster.rst +0 -0
  114. {hypershell-2.7.0 → hypershell-2.7.2}/docs/api/data.rst +0 -0
  115. {hypershell-2.7.0 → hypershell-2.7.2}/docs/api/index.rst +0 -0
  116. {hypershell-2.7.0 → hypershell-2.7.2}/docs/api/server.rst +0 -0
  117. {hypershell-2.7.0 → hypershell-2.7.2}/docs/api/submit.rst +0 -0
  118. {hypershell-2.7.0 → hypershell-2.7.2}/docs/blog/20230329_2_2_0_release.rst +0 -0
  119. {hypershell-2.7.0 → hypershell-2.7.2}/docs/blog/20230413_2_3_0_release.rst +0 -0
  120. {hypershell-2.7.0 → hypershell-2.7.2}/docs/blog/20230602_2_4_0_release.rst +0 -0
  121. {hypershell-2.7.0 → hypershell-2.7.2}/docs/blog/20240518_2_5_0_release.rst +0 -0
  122. {hypershell-2.7.0 → hypershell-2.7.2}/docs/blog/20240706_2_5_2_release.rst +0 -0
  123. {hypershell-2.7.0 → hypershell-2.7.2}/docs/blog/20241115_2_6_0_release.rst +0 -0
  124. {hypershell-2.7.0 → hypershell-2.7.2}/docs/blog/20241115_announce_logo.rst +0 -0
  125. {hypershell-2.7.0 → hypershell-2.7.2}/docs/blog/20241231_2_6_1_release.rst +0 -0
  126. {hypershell-2.7.0 → hypershell-2.7.2}/docs/blog/20250215_2_6_5_release.rst +0 -0
  127. {hypershell-2.7.0 → hypershell-2.7.2}/docs/blog/20250405_2_6_6_release.rst +0 -0
  128. {hypershell-2.7.0 → hypershell-2.7.2}/docs/blog/20250504_2_7_0_release.rst +0 -0
  129. {hypershell-2.7.0 → hypershell-2.7.2}/docs/cli/client.rst +0 -0
  130. {hypershell-2.7.0 → hypershell-2.7.2}/docs/cli/cluster.rst +0 -0
  131. {hypershell-2.7.0 → hypershell-2.7.2}/docs/cli/config_edit.rst +0 -0
  132. {hypershell-2.7.0 → hypershell-2.7.2}/docs/cli/config_get.rst +0 -0
  133. {hypershell-2.7.0 → hypershell-2.7.2}/docs/cli/config_set.rst +0 -0
  134. {hypershell-2.7.0 → hypershell-2.7.2}/docs/cli/config_which.rst +0 -0
  135. {hypershell-2.7.0 → hypershell-2.7.2}/docs/cli/initdb.rst +0 -0
  136. {hypershell-2.7.0 → hypershell-2.7.2}/docs/cli/server.rst +0 -0
  137. {hypershell-2.7.0 → hypershell-2.7.2}/docs/cli/submit.rst +0 -0
  138. {hypershell-2.7.0 → hypershell-2.7.2}/docs/cli/task_info.rst +0 -0
  139. {hypershell-2.7.0 → hypershell-2.7.2}/docs/cli/task_run.rst +0 -0
  140. {hypershell-2.7.0 → hypershell-2.7.2}/docs/cli/task_search.rst +0 -0
  141. {hypershell-2.7.0 → hypershell-2.7.2}/docs/cli/task_submit.rst +0 -0
  142. {hypershell-2.7.0 → hypershell-2.7.2}/docs/cli/task_update.rst +0 -0
  143. {hypershell-2.7.0 → hypershell-2.7.2}/docs/cli/task_wait.rst +0 -0
  144. {hypershell-2.7.0 → hypershell-2.7.2}/docs/config.rst +0 -0
  145. {hypershell-2.7.0 → hypershell-2.7.2}/docs/database.rst +0 -0
  146. {hypershell-2.7.0 → hypershell-2.7.2}/docs/logging.rst +0 -0
  147. {hypershell-2.7.0 → hypershell-2.7.2}/docs/manual.rst +0 -0
  148. {hypershell-2.7.0 → hypershell-2.7.2}/docs/roadmap.rst +0 -0
  149. {hypershell-2.7.0 → hypershell-2.7.2}/docs/templates.rst +0 -0
  150. {hypershell-2.7.0 → hypershell-2.7.2}/docs/tutorial/advanced.rst +0 -0
  151. {hypershell-2.7.0 → hypershell-2.7.2}/docs/tutorial/basic.rst +0 -0
  152. {hypershell-2.7.0 → hypershell-2.7.2}/docs/tutorial/distributed.rst +0 -0
  153. {hypershell-2.7.0 → hypershell-2.7.2}/docs/tutorial/hybrid.rst +0 -0
  154. {hypershell-2.7.0 → hypershell-2.7.2}/src/hypershell/client.py +0 -0
  155. {hypershell-2.7.0 → hypershell-2.7.2}/src/hypershell/cluster/__init__.py +0 -0
  156. {hypershell-2.7.0 → hypershell-2.7.2}/src/hypershell/cluster/local.py +0 -0
  157. {hypershell-2.7.0 → hypershell-2.7.2}/src/hypershell/cluster/remote.py +0 -0
  158. {hypershell-2.7.0 → hypershell-2.7.2}/src/hypershell/cluster/ssh.py +0 -0
  159. {hypershell-2.7.0 → hypershell-2.7.2}/src/hypershell/core/__init__.py +0 -0
  160. {hypershell-2.7.0 → hypershell-2.7.2}/src/hypershell/core/config.py +0 -0
  161. {hypershell-2.7.0 → hypershell-2.7.2}/src/hypershell/core/exceptions.py +0 -0
  162. {hypershell-2.7.0 → hypershell-2.7.2}/src/hypershell/core/fsm.py +0 -0
  163. {hypershell-2.7.0 → hypershell-2.7.2}/src/hypershell/core/heartbeat.py +0 -0
  164. {hypershell-2.7.0 → hypershell-2.7.2}/src/hypershell/core/logging.py +0 -0
  165. {hypershell-2.7.0 → hypershell-2.7.2}/src/hypershell/core/platform.py +0 -0
  166. {hypershell-2.7.0 → hypershell-2.7.2}/src/hypershell/core/pretty_print.py +0 -0
  167. {hypershell-2.7.0 → hypershell-2.7.2}/src/hypershell/core/queue.py +0 -0
  168. {hypershell-2.7.0 → hypershell-2.7.2}/src/hypershell/core/remote.py +0 -0
  169. {hypershell-2.7.0 → hypershell-2.7.2}/src/hypershell/core/signal.py +0 -0
  170. {hypershell-2.7.0 → hypershell-2.7.2}/src/hypershell/core/sys.py +0 -0
  171. {hypershell-2.7.0 → hypershell-2.7.2}/src/hypershell/core/tag.py +0 -0
  172. {hypershell-2.7.0 → hypershell-2.7.2}/src/hypershell/core/template.py +0 -0
  173. {hypershell-2.7.0 → hypershell-2.7.2}/src/hypershell/core/thread.py +0 -0
  174. {hypershell-2.7.0 → hypershell-2.7.2}/src/hypershell/core/types.py +0 -0
  175. {hypershell-2.7.0 → hypershell-2.7.2}/src/hypershell/core/uuid.py +0 -0
  176. {hypershell-2.7.0 → hypershell-2.7.2}/src/hypershell/data/core.py +0 -0
  177. {hypershell-2.7.0 → hypershell-2.7.2}/src/hypershell/data/model.py +0 -0
  178. {hypershell-2.7.0 → hypershell-2.7.2}/src/hypershell/server.py +0 -0
  179. {hypershell-2.7.0/tests/unit → hypershell-2.7.2/tests}/test_data/__init__.py +0 -0
  180. {hypershell-2.7.0/tests/unit → hypershell-2.7.2/tests}/test_data/test_core.py +0 -0
  181. {hypershell-2.7.0/tests/unit → hypershell-2.7.2/tests}/test_data/test_model.py +0 -0
@@ -0,0 +1,12 @@
1
+ # These are supported funding model platforms
2
+
3
+ github: glentner
4
+ patreon: # Replace with a single Patreon username
5
+ open_collective: # Replace with a single Open Collective username
6
+ ko_fi: # Replace with a single Ko-fi username
7
+ tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8
+ community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9
+ liberapay: # Replace with a single Liberapay username
10
+ issuehunt: # Replace with a single IssueHunt username
11
+ otechie: # Replace with a single Otechie username
12
+ custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
@@ -0,0 +1,19 @@
1
+ name: Publish
2
+ on:
3
+ release:
4
+ types: [created]
5
+
6
+ jobs:
7
+ publish:
8
+ runs-on: ubuntu-latest
9
+ steps:
10
+ - uses: actions/checkout@v4
11
+
12
+ - name: Install uv
13
+ uses: astral-sh/setup-uv@v5
14
+ with:
15
+ enable-cache: true
16
+ cache-dependency-glob: "uv.lock"
17
+
18
+ - name: Publish to PyPI
19
+ run: uv build && uv publish --token ${{ secrets.PYPI_TOKEN }}
@@ -0,0 +1,24 @@
1
+ name: Tests
2
+ on:
3
+ push:
4
+ branches: [ master, develop ]
5
+ pull_request:
6
+ branches: [ develop ]
7
+
8
+ jobs:
9
+ tests:
10
+ runs-on: ubuntu-latest
11
+ strategy:
12
+ matrix:
13
+ python-version: [ '3.9', '3.10', '3.11', '3.12', '3.13' ]
14
+ steps:
15
+ - uses: actions/checkout@v4
16
+
17
+ - name: Install uv
18
+ uses: astral-sh/setup-uv@v5
19
+ with:
20
+ enable-cache: true
21
+ cache-dependency-glob: "uv.lock"
22
+
23
+ - name: Run tests
24
+ run: uv run --python ${{ matrix.python-version }} pytest -v
@@ -3,7 +3,7 @@ From: python:3.13-slim
3
3
  Stage: final
4
4
 
5
5
  %labels
6
- Version="2.7.0"
6
+ Version="2.7.2"
7
7
  Author="glentner@purdue.edu"
8
8
 
9
9
  %files
@@ -1,7 +1,7 @@
1
1
  FROM python:3.13-slim
2
2
  COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
3
3
 
4
- LABEL version="2.7.0"
4
+ LABEL version="2.7.2"
5
5
  LABEL authors="glentner@purdue.edu"
6
6
  LABEL org.opencontainers.image.source="https://github.com/hypershell/hypershell"
7
7
  LABEL org.opencontainers.image.description="HyperShell Base Image"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hypershell
3
- Version: 2.7.0
3
+ Version: 2.7.2
4
4
  Summary: A cross-platform, high-throughput computing utility for processing shell commands over a distributed, asynchronous queue.
5
5
  Author-email: Geoffrey Lentner <glentner@purdue.edu>
6
6
  License-Expression: Apache-2.0
@@ -16,6 +16,7 @@ Classifier: Programming Language :: Python :: 3.10
16
16
  Classifier: Programming Language :: Python :: 3.11
17
17
  Classifier: Programming Language :: Python :: 3.12
18
18
  Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Programming Language :: Python :: 3.14
19
20
  Classifier: Topic :: Utilities
20
21
  Requires-Python: >=3.9
21
22
  Requires-Dist: cmdkit[toml]>=2.7.7
@@ -41,14 +42,14 @@ HyperShell v2: Distributed Task Execution for HPC
41
42
  :target: https://github.com/hypershell/hypershell/releases
42
43
  :alt: Github Release
43
44
 
44
- .. image:: https://static.pepy.tech/badge/hypershell/month
45
- :target: https://pypi.org/project/hypershell/
46
- :alt: PyPI Monthly Downloads
47
-
48
45
  .. image:: https://img.shields.io/badge/Python-3.9+-blue.svg
49
46
  :target: https://www.python.org/downloads
50
47
  :alt: Python Versions
51
48
 
49
+ .. image:: https://static.pepy.tech/badge/hypershell/month
50
+ :target: https://pypi.org/project/hypershell/
51
+ :alt: PyPI Monthly Downloads
52
+
52
53
  .. image:: https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg
53
54
  :target: https://www.contributor-covenant.org/version/2/1/code_of_conduct/
54
55
  :alt: Code of Conduct
@@ -57,6 +58,10 @@ HyperShell v2: Distributed Task Execution for HPC
57
58
  :target: https://hypershell.readthedocs.io/en/latest/?badge=latest
58
59
  :alt: Documentation Status
59
60
 
61
+ .. image:: https://github.com/hypershell/hypershell/actions/workflows/tests.yml/badge.svg
62
+ :target: https://github.com/hypershell/hypershell/actions/workflows/tests.yml
63
+ :alt: Tests
64
+
60
65
  |
61
66
 
62
67
  *HyperShell* is an elegant, cross-platform, high-throughput computing utility for
@@ -9,14 +9,14 @@ HyperShell v2: Distributed Task Execution for HPC
9
9
  :target: https://github.com/hypershell/hypershell/releases
10
10
  :alt: Github Release
11
11
 
12
- .. image:: https://static.pepy.tech/badge/hypershell/month
13
- :target: https://pypi.org/project/hypershell/
14
- :alt: PyPI Monthly Downloads
15
-
16
12
  .. image:: https://img.shields.io/badge/Python-3.9+-blue.svg
17
13
  :target: https://www.python.org/downloads
18
14
  :alt: Python Versions
19
15
 
16
+ .. image:: https://static.pepy.tech/badge/hypershell/month
17
+ :target: https://pypi.org/project/hypershell/
18
+ :alt: PyPI Monthly Downloads
19
+
20
20
  .. image:: https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg
21
21
  :target: https://www.contributor-covenant.org/version/2/1/code_of_conduct/
22
22
  :alt: Code of Conduct
@@ -25,6 +25,10 @@ HyperShell v2: Distributed Task Execution for HPC
25
25
  :target: https://hypershell.readthedocs.io/en/latest/?badge=latest
26
26
  :alt: Documentation Status
27
27
 
28
+ .. image:: https://github.com/hypershell/hypershell/actions/workflows/tests.yml/badge.svg
29
+ :target: https://github.com/hypershell/hypershell/actions/workflows/tests.yml
30
+ :alt: Tests
31
+
28
32
  |
29
33
 
30
34
  *HyperShell* is an elegant, cross-platform, high-throughput computing utility for
@@ -0,0 +1 @@
1
+ Manage configuration.
@@ -0,0 +1,26 @@
1
+ Commands
2
+ ^^^^^^^^
3
+
4
+ ``get``
5
+ Get configuration option.
6
+
7
+ ``set``
8
+ Set configuration option.
9
+
10
+ ``edit``
11
+ Edit configuration with default editor.
12
+
13
+ ``which``
14
+ Show origin of configuration option.
15
+
16
+ Options
17
+ ^^^^^^^
18
+
19
+ ``--system``
20
+ Show system-level config path.
21
+
22
+ ``--user``
23
+ Show user-level config path.
24
+
25
+ ``--local``
26
+ Show local-level config path.
@@ -0,0 +1,9 @@
1
+ ``hs`` ``config`` ``[-h]`` ``[--system | --local | --user]``
2
+
3
+ ``hs`` ``config`` ``get`` ``[-h]`` ``SECTION[...].VAR`` ``[-x]`` ``[-r]`` ``[--system | --user | --local | --default]``
4
+
5
+ ``hs`` ``config`` ``set`` ``[-h]`` ``SECTION[...].VAR`` ``VALUE`` ``[--system | --user | --local]``
6
+
7
+ ``hs`` ``config`` ``edit`` ``[-h]`` ``[--system | --user | --local]``
8
+
9
+ ``hs`` ``config`` ``which`` ``[-h]`` ``SECTION[...].VAR`` ``[--site]``
@@ -153,6 +153,7 @@ a few quality of life improvements, and a fix for SSH-mode.
153
153
  :hidden:
154
154
  :maxdepth: 1
155
155
 
156
+ 20250504_2_7_0_release
156
157
  20250405_2_6_6_release
157
158
  20250215_2_6_5_release
158
159
  20241231_2_6_1_release
@@ -0,0 +1,18 @@
1
+ .. _cli_config:
2
+
3
+ Config
4
+ ======
5
+
6
+ Usage
7
+ -----
8
+
9
+ .. include:: ../_include/config_usage.rst
10
+
11
+ Description
12
+ -----------
13
+
14
+ .. include:: ../_include/config_desc.rst
15
+
16
+ |
17
+
18
+ .. include:: ../_include/config_help.rst
@@ -27,6 +27,7 @@ Subcommands
27
27
  run <task_run>
28
28
  list <task_search>
29
29
  update <task_update>
30
+ config <config>
30
31
  config get <config_get>
31
32
  config set <config_set>
32
33
  config edit <config_edit>
@@ -72,7 +72,7 @@ html_css_files = [
72
72
  "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/solid.min.css",
73
73
  "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/brands.min.css",
74
74
  ]
75
- html_favicon = '_static/logo.svg'
75
+ html_favicon = '_static/logo-dark-mode.png'
76
76
  html_theme_options = {
77
77
  # 'announcement': 'See Installation page for not on PyPI package name issue!',
78
78
  'sidebar_hide_name': True,
@@ -13,7 +13,7 @@ the top-level entry point *script* on your `PATH`. The well-known `uv <https://d
13
13
  utility handles all of this nicely for unprivileged users installing for themselves.
14
14
 
15
15
  See the :ref:`installation <install>` guide for more options and additional notes and
16
- recommendations.
16
+ recommendations, including package `extras` for PostgreSQL, UUIDv7, etc.
17
17
 
18
18
 
19
19
  .. tab:: uv
@@ -56,7 +56,7 @@ will manage tasks entirely within memory.
56
56
 
57
57
  .. code-block:: shell
58
58
 
59
- seq 4 | hs cluster -t 'echo {}'
59
+ seq 4 | hsx -t 'echo {}'
60
60
 
61
61
  .. details:: Output
62
62
 
@@ -81,7 +81,7 @@ see additional detail about what is running, where, and when.
81
81
 
82
82
  .. code-block:: shell
83
83
 
84
- hs cluster tasks.in -N16 --ssh-group=xyz --capture
84
+ hsx tasks.in -N16 --ssh-group=xyz --capture
85
85
 
86
86
  .. details:: Logs
87
87
 
@@ -107,7 +107,7 @@ example we stagger the launch process over one minute.
107
107
 
108
108
  .. code-block:: shell
109
109
 
110
- hs cluster tasks.in -N128 -b128 --launcher=srun --max-retries=2 --delay-start=-60 >task.out
110
+ hsx tasks.in -N128 -b128 --launcher=srun --max-retries=2 --delay-start=-60 >task.out
111
111
 
112
112
  .. details:: Logs
113
113
 
@@ -175,7 +175,7 @@ expansion. Many meta-patterns are supported (see full overview of :ref:`template
175
175
 
176
176
  .. code-block:: shell
177
177
 
178
- hs cluster tasks.in -N12 -t './some_program.py {} >outputs/{/-}.out'
178
+ hsx tasks.in -N12 -t './some_program.py {} >outputs/{/-}.out'
179
179
 
180
180
  Capturing `stdout` and `stderr` is supported directly in fact with the ``--capture`` option.
181
181
  See the full documentation for environment variables under :ref:`configuration <config>`.
@@ -15,10 +15,18 @@ Release v\ |release| (:ref:`Getting Started <getting_started>`)
15
15
  :target: https://www.python.org/downloads
16
16
  :alt: Python Versions
17
17
 
18
+ .. image:: https://static.pepy.tech/badge/hypershell/month
19
+ :target: https://pypi.org/project/hypershell/
20
+ :alt: PyPI Monthly Downloads
21
+
18
22
  .. image:: https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg
19
23
  :target: https://www.contributor-covenant.org/version/2/1/code_of_conduct/
20
24
  :alt: Code of Conduct
21
25
 
26
+ .. image:: https://github.com/hypershell/hypershell/actions/workflows/tests.yml/badge.svg
27
+ :target: https://github.com/hypershell/hypershell/actions/workflows/tests.yml
28
+ :alt: Tests
29
+
22
30
  |
23
31
 
24
32
  .. include:: _include/desc.rst
@@ -0,0 +1,322 @@
1
+ .. _install:
2
+
3
+ Installation
4
+ ============
5
+
6
+ |
7
+
8
+ Installing *HyperShell* can take several forms. At the end of the day it is a Python package
9
+ and needs to live within some prefix and be tied to some Python runtime. As a system utility
10
+ we probably do not want to expose our dependencies to other user environments incidentally.
11
+ For these reasons, it is recommended to isolate *HyperShell* within its own virtual environment
12
+ and only exposed the top-level entry point *script* to the users `PATH`.
13
+
14
+ -------------------
15
+
16
+ Basic Installation
17
+ ------------------
18
+
19
+ |
20
+
21
+ The `uv <https://docs.astral.sh/uv/>`_ utility wraps all of this up nicely for user-level
22
+ installations. On any platform, if installing for yourself, especially if you lack root
23
+ or administrative privileges, we recommend the following.
24
+
25
+ .. admonition:: Install HyperShell using uv
26
+ :class: note
27
+
28
+ .. code-block:: shell
29
+
30
+ uv tool install hypershell
31
+
32
+
33
+ For `macOS` users we can accomplish the same thing with `Homebrew <https://brew.sh>`_.
34
+ This formula essentially does the same thing but managed by ``brew`` instead.
35
+
36
+
37
+ .. admonition:: Install HyperShell using Homebrew
38
+ :class: note
39
+
40
+ .. code-block:: shell
41
+
42
+ brew tap hypershell/tap
43
+ brew install hypershell
44
+
45
+
46
+ The `macOS` Homebrew installation method automatically includes the package extras needed
47
+ for using PostgreSQL as a backend but does not include the UUIDv7 extra. When installing
48
+ the package directly from the package index, the following extras are available
49
+
50
+ * ``postgres``: includes ``psycopg2`` for using PostgreSQL
51
+ * ``uuid7``: includes ``uuid-utils`` and to auto-enable use of UUIDv7 for task IDs.
52
+
53
+ For example, you could install HyperShell with the following:
54
+
55
+ .. admonition:: Install HyperShell with PostgreSQL support
56
+ :class: note
57
+
58
+ .. code-block:: shell
59
+
60
+ uv tool install 'hypershell[postgres]' --python 3.13
61
+
62
+
63
+ -------------------
64
+
65
+ Linux Packages
66
+ --------------
67
+
68
+ |
69
+
70
+ We want to support Linux package managers directly to make it easy to use HyperShell as a system-level
71
+ tool with minimal effort to add to your environment. The following Linux distributions are currently
72
+ being considered but may or may not be available currently.
73
+
74
+ |
75
+
76
+ Debian / Ubuntu (coming soon)
77
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
78
+
79
+ .. admonition:: Install as a Debian package
80
+ :class: note
81
+
82
+ .. code-block:: shell
83
+
84
+ sudo apt install hypershell
85
+
86
+ |
87
+
88
+ Ubuntu (coming soon)
89
+ ^^^^^^^^^^^^^^^^^^^^
90
+
91
+ Installing as a `snap` allows for a self-contained package and even control over the
92
+ level of `confinement`, unlike other container formats. This is particularly nice for
93
+ Ubuntu-like distributions on small devices (such as Raspberry Pi).
94
+
95
+ .. admonition:: Install as a Snap package
96
+ :class: note
97
+
98
+ .. code-block:: shell
99
+
100
+ sudo snap install hypershell
101
+
102
+ |
103
+
104
+ Fedora / Alma / Rocky / RHEL
105
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
106
+
107
+ We are now shipping in `Fedora <https://packages.fedoraproject.org/pkgs/hypershell/hypershell/>`_
108
+ (Fedora 42, Fedora Rawhide, EPEL 10.0, EPEL 10.1).
109
+
110
+ Note `issue 35 <https://github.com/hypershell/hypershell/issues/35>`_ where ``/usr/bin/hs`` is in
111
+ conflict with another `package <https://crates.io/crates/heatseeker>`_. For the time being,
112
+ the ``hs`` command is renamed to ``hsh`` (though this is not ideal and may change later).
113
+
114
+ .. admonition:: Install from EPEL
115
+ :class: note
116
+
117
+ .. code-block:: shell
118
+
119
+ sudo dnf install hypershell
120
+
121
+ .. admonition:: Install from EPEL
122
+ :class: note
123
+
124
+ .. code-block:: shell
125
+
126
+ sudo yum install hypershell
127
+
128
+
129
+ -------------------
130
+
131
+ Docker and Apptainer
132
+ --------------------
133
+
134
+ |
135
+
136
+ The project includes both a ``Dockerfile`` and ``Apptainer`` build definition.
137
+ Using the software within a container is of limited utility however as the entire point
138
+ of HyperShell is to run other programs (and in a distributed fashion).
139
+ Deploying the `server` as a Docker container (e.g., within a `Kubernetes` environment)
140
+ is indeed useful though as it allows you to run it in a persistent fashion alongside of an HPC
141
+ environment.
142
+
143
+ In a purely containerized environment HyperShell can be included in your own container image.
144
+ HyperShell has both improved ergonomics and performance over scheduling "jobs" directly
145
+ within a Kubernetes-like environment (e.g., ``kubectl``),
146
+ with much better throughput and responsiveness.
147
+
148
+ The fact that your configuration can be entirely defined in terms of environment variables
149
+ makes it easy to setup your deployment without needing to embed the configuration.
150
+
151
+
152
+ -------------------
153
+
154
+ HPC Module (LMOD)
155
+ -----------------
156
+
157
+ |
158
+
159
+ System administrators may want to install and expose `HyperShell` in a custom location.
160
+ On something like an HPC cluster this could be an entirely different file system.
161
+ Let us assume this is the case, and that we already have our own Python installation
162
+ managed by some `module` system.
163
+
164
+ Here we will create an isolated prefix for the installation with version number included
165
+ and only expose the entry-point scripts to users, along with shell completions and the
166
+ manual page. Some desired runtime, ``python3.13``, is already loaded.
167
+
168
+ If there is not already a preferred Python module it might be easier to use
169
+ `conda-forge <https://conda-forge.org>`_ (or `mamba <https://mamba.readthedocs.io>`_)
170
+ or ``uv`` directly to create a virtual environment.
171
+
172
+ .. admonition:: Create installation manually on a shared system
173
+ :class: note
174
+
175
+ .. code-block:: shell
176
+
177
+ mkdir -p /apps/x86_64-any/hypershell/$VERSION
178
+ cd /apps/x86_64-any/hypershell/$VERSION
179
+
180
+ git clone --depth=1 --branch=$VERSION https://github.com/hypershell/hypershell src
181
+
182
+ python3.13 -m venv libexec
183
+ libexec/bin/pip install ./src
184
+ libexec/bin/pip install psycopg2
185
+
186
+ mkdir -p bin
187
+ ln -sf ../libexec/bin/hs bin/hs
188
+ ln -sf ../libexec/bin/hsx bin/hsx
189
+ ln -sf src/share
190
+
191
+ |
192
+
193
+ Based on this installation, a simple `LMOD <https://lmod.readthedocs.io/en/latest/>`_
194
+ configuration file might then be:
195
+
196
+ .. admonition:: Module file definition (e.g., /etc/module/x86_64-any/hypershell/<VERSION>.lua)
197
+ :class: note
198
+
199
+ .. code-block:: lua
200
+
201
+ local appname = "hypershell"
202
+ local version = "<version>" -- replace with actual version
203
+ local appsdir = "/apps/x86_64-any"
204
+ local modroot = pathJoin(appsdir, appname, version)
205
+
206
+ whatis("Name: HyperShell")
207
+ whatis("Version: " .. version)
208
+ whatis("Description: A cross-platform, high-throughput computing utility for processing
209
+ shell commands over a distributed, asynchronous queue.")
210
+
211
+ prepend_path("PATH", pathJoin(modroot, "bin"))
212
+ prepend_path("MANPATH", pathJoin(modroot, "share", "man"))
213
+
214
+ -- Raw source b/c `complete -F _hs hs` does not persist with source_sh
215
+ execute { cmd="source " .. pathJoin(modroot, "share", "bash_completion.d", "hs"), modeA={"load"} }
216
+
217
+ Presumably, users would then be able to activate the software by loading the module as such.
218
+
219
+ .. admonition:: Load module
220
+ :class: note
221
+
222
+ .. code-block:: shell
223
+
224
+ module load hypershell
225
+
226
+ ------
227
+
228
+ Runtime Package Resolution
229
+ --------------------------
230
+
231
+ |
232
+
233
+ .. include:: _include/config_pythonpath.rst
234
+
235
+ For example, from the above installation we might add the following to our module:
236
+
237
+ .. admonition:: Extra setting for LMOD
238
+ :class: note
239
+
240
+ .. code-block:: lua
241
+
242
+ ...
243
+ prepend_path("HYPERSHELL_PYTHONPATH", pathJoin(modroot, "frozen-python.path"))
244
+ ...
245
+
246
+ And we can include the following paths in our frozen set.
247
+
248
+ .. admonition:: Contents of ``frozen-python.path``
249
+ :class: note
250
+
251
+ .. code-block:: shell
252
+
253
+ /apps/x86_64-any/hypershell/<version>/libexec/lib/python3.13
254
+ /apps/x86_64-any/hypershell/<version>/libexec/lib/python3.13/lib-dynload
255
+ /apps/x86_64-any/hypershell/<version>/libexec/lib/python3.13/site-packages
256
+
257
+
258
+ ------
259
+
260
+ Shell Completions
261
+ -----------------
262
+
263
+ |
264
+
265
+ On `Linux` and `macOS` platforms we provide shell completion definitions for Bash-like
266
+ environments (specialized ZShell completions coming-soon). As suggested by the LMOD
267
+ definition file included above, sourcing the ``/share/bash_completion.d/hs`` file enables
268
+ completions for the entire command-line interface.
269
+
270
+ Some completions are simple, like what options are available for the given subcommand.
271
+ Some completions are basic, such as ``--bind <tab>`` returning either ``localhost`` or ``0.0.0.0``.
272
+ Some are more sophisticated.
273
+
274
+ Some examples (but not everything):
275
+
276
+ * ``hs config get <tab>`` will autocomplete all options.
277
+ * ``hs config set OPT <tab>`` will autocomplete the current value for OPT.
278
+ * ``hs client ... --host <tab>`` will parse your host file and return possible known hosts.
279
+ * ``hs server ... --auth <tab>`` will auto-generate secure keys at random.
280
+ * ``hs server ... --port <tab>`` will select an available port on your machine.
281
+ * ``hs list <tab>`` will complete known fields.
282
+ * ``hs list ... -t <tab>`` will complete known tags in the database.
283
+ * ``hs list ... -t key:<tab>`` will complete known values for that key in the database.
284
+ * ``hsx ... --ssh-group <tab>`` will autocomplete known groups in your config.
285
+
286
+
287
+ -------------------
288
+
289
+ Development
290
+ -----------
291
+
292
+ |
293
+
294
+ As a library dependency, `HyperShell` can easily be added to your project using whatever package
295
+ tooling you like. For development of `HyperShell` itself, contributors should create their own fork
296
+ of the repository on `GitHub <https://github.com/hypershell/hypershell>`_ and clone the fork locally.
297
+ We use `uv <https://docs.astral.sh/uv/>`_ for managing the development environment. The
298
+ ``uv.lock`` file is included in the repository, simply run the following command to initialize
299
+ your virtual environment.
300
+
301
+ .. admonition:: Install development dependencies inside local forked repository
302
+ :class: note
303
+
304
+ .. code-block:: shell
305
+
306
+ uv sync --all-packages --python 3.13
307
+
308
+
309
+ Unit and integration tests can be run using `pytest <https://pytest.org>`_.
310
+ Tests should pass for Python 3.9 and beyond.
311
+ These are largely lightweight tests in isolated ``HYPERSHELL_SITE`` directories
312
+ but can be slow because of the time to launch processes.
313
+ Use ``-n`` to parallelize tests.
314
+
315
+ .. admonition:: Run tests
316
+ :class: note
317
+
318
+ .. code-block:: shell
319
+
320
+ uv run --python 3.13 pytest -v -n 8
321
+
322
+ |
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "hypershell"
3
- version = "2.7.0"
3
+ version = "2.7.2"
4
4
  description = "A cross-platform, high-throughput computing utility for processing shell commands over a distributed, asynchronous queue."
5
5
  readme = "README.rst"
6
6
  license = "Apache-2.0"
@@ -25,6 +25,7 @@ classifiers = [
25
25
  "Programming Language :: Python :: 3.11",
26
26
  "Programming Language :: Python :: 3.12",
27
27
  "Programming Language :: Python :: 3.13",
28
+ "Programming Language :: Python :: 3.14",
28
29
  "Operating System :: POSIX :: Linux",
29
30
  "Operating System :: MacOS",
30
31
  "Operating System :: Microsoft :: Windows",
@@ -54,7 +55,8 @@ dev = [
54
55
  "uuid-utils>=0.10.0",
55
56
  "pytest>=8.1.1",
56
57
  "hypothesis>=6.100.0",
57
- "sphinx-autobuild>=2024.2.4"
58
+ "sphinx-autobuild>=2024.2.4",
59
+ "pytest-xdist>=3.7.0",
58
60
  ]
59
61
  docs = [
60
62
  "sphinx>=6.0,<8.0",
@@ -81,3 +83,11 @@ hsx = "hypershell:main_x"
81
83
  [build-system]
82
84
  requires = ["hatchling"]
83
85
  build-backend = "hatchling.build"
86
+
87
+ [tool.pytest.ini_options]
88
+ addopts = ["--strict-markers", ]
89
+ markers = [
90
+ 'unit', # Unit tests are short, interface driven tests on discrete components.",
91
+ 'integration', # Integration tests are often longer and deal with the interaction between systems.",
92
+ 'parameterize', # Placeholder for parameterized tests (not a real type).",
93
+ ]
@@ -52,7 +52,7 @@ function _hs_initdb ()
52
52
 
53
53
  function _hs_config ()
54
54
  {
55
- local all_opts="get set edit which -h --help"
55
+ local all_opts="get set edit which -h --help --system --user --local"
56
56
 
57
57
  local i=1 opt= subcmd_i=
58
58
  while [[ ${i} -lt ${COMP_CWORD} ]]; do