Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion src/did/implementations/doc2sql.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,14 @@ def _get_superclass_str(doc_props):
For DID-python style ["base", "demoA"], use directly.
"""
# DID-python schema format: top-level 'superclasses' list of strings
if "superclasses" in doc_props and isinstance(doc_props["superclasses"], list):
if "superclasses" in doc_props and isinstance(
doc_props["superclasses"], (list, dict)
):
superclasses = doc_props["superclasses"]
# Normalize bare dict to a single-element list (MATLAB's jsonencode
# unwraps single-element cell arrays into scalars).
if isinstance(superclasses, dict):
superclasses = [superclasses]
if not superclasses:
return ""
names = []
Expand All @@ -70,6 +76,9 @@ def _get_superclass_str(doc_props):

# NDI / MATLAB format: document_class.superclasses
superclasses = get_field(doc_props, ["document_class.superclasses"])
# Normalize bare dict (single superclass from MATLAB's jsonencode)
if isinstance(superclasses, dict):
superclasses = [superclasses]
if isinstance(superclasses, list):
names = []
for sc in superclasses:
Expand Down
45 changes: 45 additions & 0 deletions tests/test_doc2sql_superclass.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
"""Tests for _get_superclass_str handling of bare dict superclasses.

Regression tests for https://github.com/Waltham-Data-Science/NDI-python/issues/52
"""

from did.implementations.doc2sql import _get_superclass_str


class TestGetSuperclassStrBareDict:
"""Bare dict superclasses (from MATLAB's jsonencode) should be handled."""

def test_top_level_bare_dict(self):
doc_props = {"superclasses": {"definition": "$NDIDOCUMENTPATH/base.json"}}
assert _get_superclass_str(doc_props) == "base"

def test_top_level_list_single(self):
doc_props = {"superclasses": [{"definition": "$NDIDOCUMENTPATH/base.json"}]}
assert _get_superclass_str(doc_props) == "base"

def test_document_class_bare_dict(self):
doc_props = {
"document_class": {
"superclasses": {"definition": "$NDIDOCUMENTPATH/base.json"}
}
}
assert _get_superclass_str(doc_props) == "base"

def test_document_class_list(self):
doc_props = {
"document_class": {
"superclasses": [
{"definition": "$NDIDOCUMENTPATH/base.json"},
{"definition": "$NDIDOCUMENTPATH/demoA.json"},
]
}
}
assert _get_superclass_str(doc_props) == "base, demoA"

def test_empty_superclasses(self):
doc_props = {"superclasses": []}
assert _get_superclass_str(doc_props) == ""

def test_no_superclasses(self):
doc_props = {}
assert _get_superclass_str(doc_props) == ""
Loading