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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions