diff --git a/src/did/implementations/doc2sql.py b/src/did/implementations/doc2sql.py index 72ef97a..9b2dfb7 100644 --- a/src/did/implementations/doc2sql.py +++ b/src/did/implementations/doc2sql.py @@ -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 = [] @@ -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: diff --git a/tests/test_doc2sql_superclass.py b/tests/test_doc2sql_superclass.py new file mode 100644 index 0000000..ec20b01 --- /dev/null +++ b/tests/test_doc2sql_superclass.py @@ -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) == ""