Conversation
|
This would need a matching change in GDA (back-ported to 9.38?) to add the result type to TaskStatus here. |
|
Ignoring the GDA change, I think the blueapi side of this is workable |
|
Change in gerrit: https://gerrit.diamond.ac.uk/c/gda/gda-core/+/44673 |
DominicOram
left a comment
There was a problem hiding this comment.
Looks good, thanks. Should: it would be nice to add some tests on the case where the plan is actually returning something, ideally parametrized against a few different return types.
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #1357 +/- ##
==========================================
- Coverage 95.03% 95.01% -0.02%
==========================================
Files 43 43
Lines 2779 2829 +50
==========================================
+ Hits 2641 2688 +47
- Misses 138 141 +3 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
73dcfee to
6a697c4
Compare
|
Putting this back to draft so #1312 can be included in the result |
Use pydantic to convert result to something that can be JSON serialized later.
Allow callers to access both return values and exceptions raised by plans.
dan-fernandes
left a comment
There was a problem hiding this comment.
Minor changes / questions, everything else looks reasonable 👍
src/blueapi/cli/cli.py
Outdated
| ) -> None: | ||
| """Run a plan with parameters""" | ||
| client: BlueapiClient = obj["client"] | ||
| client: BlueapiClient = cast(BlueapiClient, obj["client"]) |
There was a problem hiding this comment.
What is the benefit of using cast instead of assuming obj["client"] will be of type BlueapiClient and just typing it as such?
There was a problem hiding this comment.
For some reason the type-checker fails to recognise that it is a BlueapiClient otherwise. Using typing.reveal_type gives
$ uv run pyright src/blueapi/cli/cli.py 17:01:39
/dls/athena/blueapi/src/blueapi/cli/cli.py
/dls/athena/blueapi/src/blueapi/cli/cli.py:295:17 - information: Type of "client" is "Unknown | BlueapiClient"
It might be ok to just use the cast though without the type-hint
|
|
||
| if resp.task_status is not None and not resp.task_status.task_failed: | ||
| print("Plan Succeeded") | ||
| match resp.result: |
There was a problem hiding this comment.
Is the success / failure of the task logged anywhere? I am open to print statements in a CLI for a human user, but I think that either:
- These should be logs, or
TaskWorkershould log outcome of task
There was a problem hiding this comment.
Are logs from the CLI sent anywhere other than the terminal? I have added a success/fail log to the task worker but that won't affect the client output.
Arguably these should use click.echo but it used print before and I didn't want to change that at the same time.
|
Good spot on the unused loggers - they were left from an earlier iteration. Thanks |
The
TaskStatusincluded in eachWorkerEventnow contains aresultfield that will be populated when the plan is complete. This can be
either a
TaskResultthat contains a serialized representation of thereturn value from a plan that succeeded, or a
TaskErrorcontaining theException type and message raised by a plan that failed.
The existing
task_completeandtask_failedflags have been left forbackwards compatibility but are now redundant and may be removed in a
future version.
Error reporting in WorkerEvents is left unchanged for now but may also
change in future as plan errors are included in the worker error list
making it unclear where an error occurred.
The new outcome states in the returned
TaskStatusallows betterfeedback in the CLI and errors/return values are included in the output.
The BlueapiClient run_task method now returns only the TaskStatus as it
now contains all relevant information about the plan. A plan failing
will now not raise an exception with exceptions being raised only in the
case of the communication errors or internal server errors. Users of the
client should check if plans were successful.