sliderule-cli 5.6.1__tar.gz → 5.6.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 (25) hide show
  1. {sliderule_cli-5.6.1/src/sliderule_cli.egg-info → sliderule_cli-5.6.2}/PKG-INFO +1 -1
  2. {sliderule_cli-5.6.1 → sliderule_cli-5.6.2/src/sliderule_cli.egg-info}/PKG-INFO +1 -1
  3. sliderule_cli-5.6.2/src/sliderule_cli.egg-info/scm_version.json +8 -0
  4. {sliderule_cli-5.6.1 → sliderule_cli-5.6.2}/src/sliderule_runner/database.py +1 -0
  5. {sliderule_cli-5.6.1 → sliderule_cli-5.6.2}/src/sliderule_runner/main.py +39 -8
  6. sliderule_cli-5.6.1/src/sliderule_cli.egg-info/scm_version.json +0 -8
  7. {sliderule_cli-5.6.1 → sliderule_cli-5.6.2}/.gitignore +0 -0
  8. {sliderule_cli-5.6.1 → sliderule_cli-5.6.2}/LICENSE +0 -0
  9. {sliderule_cli-5.6.1 → sliderule_cli-5.6.2}/README.md +0 -0
  10. {sliderule_cli-5.6.1 → sliderule_cli-5.6.2}/pyproject.toml +0 -0
  11. {sliderule_cli-5.6.1 → sliderule_cli-5.6.2}/setup.cfg +0 -0
  12. {sliderule_cli-5.6.1 → sliderule_cli-5.6.2}/src/sliderule_cli.egg-info/SOURCES.txt +0 -0
  13. {sliderule_cli-5.6.1 → sliderule_cli-5.6.2}/src/sliderule_cli.egg-info/dependency_links.txt +0 -0
  14. {sliderule_cli-5.6.1 → sliderule_cli-5.6.2}/src/sliderule_cli.egg-info/entry_points.txt +0 -0
  15. {sliderule_cli-5.6.1 → sliderule_cli-5.6.2}/src/sliderule_cli.egg-info/requires.txt +0 -0
  16. {sliderule_cli-5.6.1 → sliderule_cli-5.6.2}/src/sliderule_cli.egg-info/scm_file_list.json +0 -0
  17. {sliderule_cli-5.6.1 → sliderule_cli-5.6.2}/src/sliderule_cli.egg-info/top_level.txt +0 -0
  18. {sliderule_cli-5.6.1 → sliderule_cli-5.6.2}/src/sliderule_cluster/__init__.py +0 -0
  19. {sliderule_cli-5.6.1 → sliderule_cli-5.6.2}/src/sliderule_cluster/main.py +0 -0
  20. {sliderule_cli-5.6.1 → sliderule_cli-5.6.2}/src/sliderule_provisioner/__init__.py +0 -0
  21. {sliderule_cli-5.6.1 → sliderule_cli-5.6.2}/src/sliderule_provisioner/main.py +0 -0
  22. {sliderule_cli-5.6.1 → sliderule_cli-5.6.2}/src/sliderule_recorder/__init__.py +0 -0
  23. {sliderule_cli-5.6.1 → sliderule_cli-5.6.2}/src/sliderule_recorder/environment.yml +0 -0
  24. {sliderule_cli-5.6.1 → sliderule_cli-5.6.2}/src/sliderule_recorder/main.py +0 -0
  25. {sliderule_cli-5.6.1 → sliderule_cli-5.6.2}/src/sliderule_runner/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sliderule-cli
3
- Version: 5.6.1
3
+ Version: 5.6.2
4
4
  Summary: SlideRule Command Line Tool
5
5
  License-Expression: BSD-3-Clause
6
6
  Requires-Python: >=3.9
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sliderule-cli
3
- Version: 5.6.1
3
+ Version: 5.6.2
4
4
  Summary: SlideRule Command Line Tool
5
5
  License-Expression: BSD-3-Clause
6
6
  Requires-Python: >=3.9
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "5.6.2",
3
+ "distance": 0,
4
+ "node": "g76fb3116a5b77c6fbeb8f8df0a2cdffe60a1418b",
5
+ "dirty": false,
6
+ "branch": "main",
7
+ "node_date": "2026-09-23"
8
+ }
@@ -14,6 +14,7 @@
14
14
  # },
15
15
  # "complete": <true|false>,
16
16
  # "results": [ {result 1}, {result 2}, ... {result N} ]
17
+ # "jobs": { <child_job_id>: {child job status} }
17
18
  # },
18
19
  # ...
19
20
  # }
@@ -122,9 +122,10 @@ class Tool:
122
122
  try:
123
123
  if submission["complete"]:
124
124
  print(f"Scraping {name} ...")
125
- for result in submission["results"]:
125
+ for i in range(len(submission["results"])):
126
+ result = submission["results"][i]
126
127
  if result["status"] in self.args.status:
127
- print(f"{result["arg"]}")
128
+ print(f'{i:-5d}: {result["arg"]}')
128
129
  arg_list.append(result["arg"])
129
130
  else:
130
131
  print(f"Skipping {name} because it is still pending")
@@ -142,17 +143,32 @@ class Tool:
142
143
  complete = job["complete"]
143
144
  print(f"Statusing {name} ...")
144
145
  if not complete:
145
- report = self.session.runner.queue(job_id=job["job_id"], queue=queue)["report"]
146
+ queue_status = self.session.runner.queue(job_id=job["job_id"], queue=queue, verbose=True)
147
+ # jobs
148
+ child_jobs = queue_status["jobs"]
149
+ self.database.submissions[name]["jobs"] = {}
150
+ for child_job in child_jobs:
151
+ self.database.submissions[name]["jobs"][int(child_job["index"])] = child_job
152
+ # report
153
+ report = queue_status["report"]
146
154
  self.database.submissions[name]["status"] = report
147
- if sum([report[s] for s in [JobState.SUBMITTED, JobState.PENDING, JobState.RUNNABLE, JobState.STARTING, JobState.RUNNING]]) == 0:
155
+ jobs_in_progress = sum([report[s] for s in [JobState.SUBMITTED, JobState.PENDING, JobState.RUNNABLE, JobState.STARTING, JobState.RUNNING]])
156
+ jobs_complete = sum([report[s] for s in [JobState.SUCCEEDED, JobState.FAILED]])
157
+ if jobs_in_progress == 0 and jobs_complete > 0:
148
158
  print(f"Job {name} complete, reading results ...")
149
159
  self.database.submissions[name]["complete"] = True
150
160
  self.database.submissions[name]["results"] = self.__get_results(job["run_url"])
151
161
  else:
152
162
  print(f"Job {name} still pending")
153
- print(",".join([f"{c:>30}" for c in ["NAME"]] + [f"{c:>10}" for c in list(JobState)]))
154
- for name,job in self.database.submissions.items():
155
- print(",".join([f"{c:>30}" for c in [name]] + [f"{c:>10}" for c in [job["status"][state] for state in list(JobState)]]))
163
+ if self.args.verbose:
164
+ print(",".join([f"{c:>30}" for c in ["NAME"]] + [f"{c:>10}" for c in ["INDEX", "STATUS"]]))
165
+ for name,job in self.database.submissions.items():
166
+ for index, child_job in job["jobs"].items():
167
+ print(",".join([f"{c:>30}" for c in [name]] + [f"{c:>10}" for c in [index, child_job["status"]]]))
168
+ else:
169
+ print(",".join([f"{c:>30}" for c in ["NAME"]] + [f"{c:>10}" for c in list(JobState)]))
170
+ for name,job in self.database.submissions.items():
171
+ print(",".join([f"{c:>30}" for c in [name]] + [f"{c:>10}" for c in [job["status"][state] for state in list(JobState)]]))
156
172
 
157
173
  # Generate Report
158
174
  def generate_report(self):
@@ -189,9 +205,18 @@ class Tool:
189
205
  rsps = self.session.runner.cancel(job_list=[job_id], queue=queue)
190
206
  print(f"Cancelled submission {name}: {rsps}")
191
207
 
208
+ # Get Logs
209
+ def get_logs(self):
210
+ name = self.args.name
211
+ index = self.args.index
212
+ job_id = self.database.submissions[name]["jobs"][str(index)]["job_id"]
213
+ events = self.session.runner.logs(job_id=job_id)
214
+ for event in events:
215
+ print(event)
216
+
192
217
  # Finish
193
218
  def finish(self):
194
- if not self.args.dryrun:
219
+ if not self.args.dryrun and "archive" not in self.args:
195
220
  # save database
196
221
  self.database.write()
197
222
 
@@ -249,6 +274,12 @@ def main():
249
274
  cancel.add_argument('--name', type=str, required=True) # name of submission
250
275
  cancel.set_defaults(func=Tool.cancel_job)
251
276
 
277
+ # logs
278
+ logs = subparsers.add_parser("logs", parents=[common], help="get log messages for a child job")
279
+ logs.add_argument('--name', type=str, required=True) # name of submission
280
+ logs.add_argument('--index', type=int, required=True) # job index
281
+ logs.set_defaults(func=Tool.get_logs)
282
+
252
283
  # parse command line
253
284
  args = parser.parse_args()
254
285
 
@@ -1,8 +0,0 @@
1
- {
2
- "tag": "5.6.1",
3
- "distance": 0,
4
- "node": "g5bc2a6eb3c8fc3927b3ffb14b511be2698a8261c",
5
- "dirty": false,
6
- "branch": "main",
7
- "node_date": "2026-09-18"
8
- }
File without changes
File without changes
File without changes
File without changes