Skip to content

DICOM endpoint crashes with ValueError: not enough values to unpack due to inconsistent extract_bids_metadata signatures #42

@Devguru-codes

Description

@Devguru-codes

Location

  • package/src/pyaslreport/main.py:37 (get_bids_metadata)
  • package/src/pyaslreport/sequences/base_sequence.py
  • package/src/pyaslreport/sequences/siemens/asl/siemens_basic_single_pld.py
  • package/src/pyaslreport/sequences/ge/asl/ge_easl_multi_pld.py

Description

The DICOM processing endpoint expects get_bids_metadata() to return a tuple (metadata, asl_context). However, extract_bids_metadata() implementation varied across sequences: GE returned a tuple (metadata, asl_context), while Siemens returned only metadata (a dict). This inconsistency caused a ValueError: not enough values to unpack when processing Siemens DICOMs.

Reproduction (on main branch)

Reproducible Code (Python)

# reproduce_bug9.py — Run: .venv\Scripts\python.exe bug_9\reproduce_bug9.py
from pyaslreport.main import get_bids_metadata
from pyaslreport.enums.modaliy_enum import ModalityTypeValues
import unittest.mock as mock

# Mock headers for GE vs Siemens
# ...
with mock.patch('pyaslreport.main.get_dicom_header', return_value=siemens_header):
    # This will crash with ValueError on main
    metadata, asl_context = get_bids_metadata({"modality": ModalityTypeValues.ASL}) 

Script output on main branch

# Test Status Detail
T1 GE extract_bids_metadata returns tuple PASS tuple
T2 Siemens extract_bids_metadata returns dict PASS dict
T3 get_bids_metadata for GE returns tuple PASS
T4 get_bids_metadata for Siemens returns tuple FAIL CRASH: not enough values to unpack

Wait, why did T1/T2 pass on main? Because historically GE wrongly returned tuple, and Siemens correctly returned dict. The crash happens in T4 where get_bids_metadata tries to unpack the dict.

API Endpoint Reproduction

# api_reproduce_bug9.py — Shows 500 error on Siemens DICOM upload
from fastapi.testclient import TestClient
from app.main import app

client = TestClient(app, raise_server_exceptions=False)
# (Create mocked Siemens DICOM file test.dcm)
with open("test.dcm", "rb") as f:
    file_content = f.read()

response = client.post(
    "/api/report/process/dicom",
    data={"modality": "ASL"},
    files=[("upload_file", ("test.dcm", file_content, "application/dicom"))]
)
print(f"Status: {response.status_code}")

API Endpoint Responses on main

POST /api/report/process/dicom (Siemens DICOM)
Status: 500 Internal Server Error
Detail: "ValueError: not enough values to unpack (expected 2, got 1)"
>> VERDICT: Bug is PRESENT.

Note: This architectural fix follows the exact suggestion of mentor Jan Petr when this issue was originally raised by Devguru-codes in the previous repository (prior to OSIPI inclusion).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions