galaxyproject / galaxyproject/galaxy
UnboundLocalError `/api/invocations/{invocation_id}/report`
- Dominant language
- Python
- Stars
- 1.9k
- Forks
- 1.2k
- Avg merge
- 2d 16h
- Merged PRs (30d)
- 169
Description
from https://sentry.galaxyproject.org/share/issue/6dc72d63eb67489f991e1ec5375eb16b/:
```
ExceptionGroup: unhandled errors in a TaskGroup
File "starlette/_utils.py", line 87, in collapse_excgroups
yield
File "starlette/middleware/base.py", line 190, in __call__
async with anyio.create_task_group() as task_group:
File "anyio/_backends/_asyncio.py", line 678, in __aexit__
raise BaseExceptionGroup(
UnboundLocalError: cannot access local variable 'ref_object' where it is not associated with a value
File "starlette/applications.py", line 123, in __call__
await self.middleware_stack(scope, receive, send)
File "starlette/middleware/errors.py", line 186, in __call__
raise exc
File "starlette/middleware/errors.py", line 164, in __call__
await self.app(scope, receive, _send)
File "starlette_context/middleware/raw_middleware.py", line 92, in __call__
await self.app(scope, receive, send_wrapper)
File "starlette/middleware/base.py", line 189, in __call__
with collapse_excgroups():
File "contextlib.py", line 155, in __exit__
self.gen.throw(typ, value, traceback)
File "starlette/_utils.py", line 93, in collapse_excgroups
raise exc
File "starlette/middleware/base.py", line 191, in __call__
response = await self.dispatch_func(request, call_next)
File "galaxy/webapps/galaxy/fast_app.py", line 108, in add_x_frame_options
response = await call_next(request)
File "starlette/middleware/base.py", line 165, in call_next
raise app_exc
File "starlette/middleware/base.py", line 151, in coro
await self.app(scope, receive_or_disconnect, send_no_error)
File "starlette/middleware/exceptions.py", line 62, in __call__
await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
File "starlette/_exception_handler.py", line 64, in wrapped_app
raise exc
File "starlette/_exception_handler.py", line 53, in wrapped_app
await app(scope, receive, sender)
File "starlette/routing.py", line 758, in __call__
await self.middleware_stack(scope, receive, send)
File "starlette/routing.py", line 778, in app
await route.handle(scope, receive, send)
File "starlette/routing.py", line 299, in handle
await self.app(scope, receive, send)
File "starlette/routing.py", line 79, in app
await wrap_app_handling_exceptions(app, request)(scope, receive, send)
File "starlette/_exception_handler.py", line 64, in wrapped_app
raise exc
File "starlette/_exception_handler.py", line 53, in wrapped_app
await app(scope, receive, sender)
File "starlette/routing.py", line 74, in app
response = await func(request)
File "fastapi/routing.py", line 278, in app
raw_response = await run_endpoint_function(
File "fastapi/routing.py", line 193, in run_endpoint_function
return await run_in_threadpool(dependant.call, **values)
File "starlette/concurrency.py", line 42, in run_in_threadpool
return await anyio.to_thread.run_sync(func, *args)
File "anyio/to_thread.py", line 56, in run_sync
return await get_async_backend().run_sync_in_worker_thread(
File "anyio/_backends/_asyncio.py", line 2144, in run_sync_in_worker_thread
return await future
File "anyio/_backends/_asyncio.py", line 851, in run
result = context.run(func, *args)
File "galaxy/webapps/galaxy/api/workflows.py", line 1482, in show_invocation_report
return self.invocations_service.show_invocation_report(trans, invocation_id)
File "galaxy/webapps/galaxy/services/invocations.py", line 143, in show_invocation_report
wfi_report = self._workflows_manager.get_invocation_report(trans, invocation_id, format=format)
File "galaxy/managers/workflows.py", line 426, in get_invocation_report
return generate_report(
File "galaxy/workflow/reports/__init__.py", line 14, in generate_report
return plugin.generate_report_json(trans, invocation, runtime_report_config_json=runtime_report_config_json)
File "galaxy/workflow/reports/generators/__init__.py", line 43, in generate_report_json
internal_markdown = self._generate_internal_markdown(
File "galaxy/workflow/reports/generators/__init__.py", line 73, in _generate_internal_markdown
internal_markdown = resolve_invocation_markdown(trans, invocation, workflow_markdown)
File "galaxy/managers/markdown_util.py", line 958, in resolve_invocation_markdown
galaxy_markdown = _remap_galaxy_markdown_calls(_remap, workflow_markdown)
File "galaxy/managers/markdown_util.py", line 1012, in _remap_galaxy_markdown_calls
return _remap_galaxy_markdown_containers(_remap_container, markdown)
File "galaxy/managers/markdown_util.py", line 971, in _remap_galaxy_markdown_containers
(replacement, whole_block) = func(replace)
File "galaxy/managers/markdown_util.py", line 1008, in _remap_container
return func(match.group(1), f"{matching_line}\n")
File "galaxy/managers/markdown_util.py", line 944, in _remap
if ref_object:
```
Contributor guide
Research direction
Start in galaxy/managers/markdown_util.py at resolve_invocation_markdown and the _remap function around the reported ref_object access. Trace how the workflow report for /api/invocations/{invocation_id}/report reaches this path and identify the input that leaves ref_object unset. Done means the endpoint no longer raises UnboundLocalError for that case and the report is generated successfully.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- api, backend
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 35/100