def test_insert_item_with_none_element(self): attrs = self.set_item_attributes() item = ODM.ItemDef(**attrs) # to support the test a null version of CodeListRef is created, but should be ignored on output if item.CodeListRef: self.assertIsNotNone(item.CodeListRef) if item.SignificantDigits: self.assertIsNotNone(item.SignificantDigits) self.loader.open_odm_document(self.odm_file) mdv = self.loader.MetaDataVersion() mdv.ItemDef.append(item) attrs = self.get_root_attributes() root = ODM.ODM(**attrs) study = self.add_study(mdv) root.Study = [study] root.write_xml(self.odm_file_out) loader = LD.ODMLoader(OL.XMLODMLoader()) loader.open_odm_document(self.odm_file_out) mdv = loader.MetaDataVersion() # is_found_inserted_item = False # for it in mdv.ItemDef: # if it.OID == "ODM.IT.AE.TEST": # is_found_inserted_item = True # self.assertTrue(is_found_inserted_item) itd = mdv.find("ItemDef", "OID", "ODM.IT.AE.TEST") self.assertEqual(itd.OID, "ODM.IT.AE.TEST") # comment was created as None and should not be part of the object self.assertIsNone(itd.Comment) itd_json = itd.to_json() self.assertNotIn("Comment", itd_json) odm_json = root.to_json()
def setUp(self) -> None: self.odm_file = os.path.join( os.path.dirname(os.path.realpath(__file__)), 'data', 'cdash-odm-test.xml') self.loader = LD.ODMLoader(OL.XMLODMLoader()) self.loader.open_odm_document(self.odm_file) self.odm = self.loader.root()
def setUp(self) -> None: self.odm_file = os.path.join( os.path.dirname(os.path.realpath(__file__)), 'data', 'define2-0-0-sdtm-test.xml') with open(self.odm_file, "r", encoding="utf-8") as f: self.odm_string = f.read() self.loader = LD.ODMLoader(OL.XMLDefineLoader())
def setUp(self): self.odm_file = os.path.join( os.path.dirname(os.path.realpath(__file__)), 'data', 'cdash-odm-test.xml') self.odm_file_out = os.path.join( os.path.dirname(os.path.realpath(__file__)), 'data', 'cdash-odm-test-insert.xml') self.loader = LD.ODMLoader(OL.XMLODMLoader())
def test_read_odm_xml(self): loader = LD.ODMLoader(OL.XMLODMLoader(model_package="odm_1_3_2", ns_uri="http://www.cdisc.org/ns/odm/v1.3")) loader.open_odm_document(ODM_XML_FILE) mdv = loader.MetaDataVersion() item_list = mdv.ItemDef item = item_list[0] self.assertEqual(item.OID, "ODM.IT.DM.BRTHYR") # tests the __len__ in ItemGroupDef self.assertEqual(len(item_list), 1)
def setUp(self) -> None: self.odm = self.add_root() self.odm_test_file = os.path.join( os.path.dirname(os.path.realpath(__file__)), 'data', 'test_odm_001.xml') self.odm_writer_test_file = os.path.join( os.path.dirname(os.path.realpath(__file__)), 'data', 'test_odm_002.xml') self.loader = LD.ODMLoader(OL.XMLODMLoader())
def test_find_record(self): loader = LD.ODMLoader( OL.XMLODMLoader(model_package="odm_1_3_2", ns_uri="http://www.cdisc.org/ns/odm/v1.3")) loader.open_odm_document(self.odm_test_file) odm = loader.load_odm() subject = odm.ClinicalData[0].find("SubjectData", "SubjectKey", "1000") self.assertEqual(subject.TransactionType, "Insert") self.assertEqual(subject.SubjectKey, "1000")
def test_read_odm_json(self): loader = LD.ODMLoader(OL.JSONODMLoader(model_package="odm_1_3_2")) loader.open_odm_document(ODM_JSON_FILE) mdv = loader.MetaDataVersion() igd_list = mdv.ItemGroupDef igd = igd_list[0] self.assertEqual(igd.OID, "ODM.IG.DM") # tests the __len__ in ItemGroupDef self.assertEqual(len(igd_list), 1)
def test_load_odm_xml_data(self): loader = LD.ODMLoader( OL.XMLODMLoader(model_package="odm_1_3_2", ns_uri="http://www.cdisc.org/ns/odm/v1.3")) loader.open_odm_document(self.odm_test_file2) odm = loader.load_odm() self.assertEqual(odm.FileOID, "Study-MetaD20220210213634") self.assertEqual(odm.ClinicalData[0].StudyOID, "1001_corona") igd_0 = odm.ClinicalData[0].SubjectData[0].StudyEventData[0].FormData[ 0].ItemGroupData[0] self.assertEqual(igd_0.ItemGroupOID, "IG.DM") self.assertEqual(igd_0.ItemData[2].ItemOID, "IT.BRTHDAT") self.assertEqual(igd_0.ItemData[2].Value, "1966-02-10")
def test_odm_round_trip(self): root = self.loader.load_odm_string(self.odm_string) odm = self.loader.create_odmlib(root) odm_json = odm.to_json() odm_json_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'data', 'cdash_odm_test.json') with open(odm_json_file, "w") as odm_in: odm_in.write(odm_json) json_loader = LD.ODMLoader(OL.JSONODMLoader()) odm_dict = json_loader.open_odm_document(odm_json_file) rt_odm = json_loader.create_odmlib(odm_dict, "ODM") odm_xml_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'data', 'cdash_odm_test_roundtrip.xml') rt_odm.write_xml(odm_xml_file) root2 = self.loader.open_odm_document(odm_xml_file) odm2 = self.loader.create_odmlib(root2) self.assertEqual(odm2.Study[0].MetaDataVersion[0].ItemDef[0].OID, "ODM.IT.Common.StudyID") self.assertEqual(len(odm2.Study[0].MetaDataVersion[0].ItemGroupDef[1]), 7)
def test_oid_index_define_igd(self): self.define_file = os.path.join( os.path.dirname(os.path.realpath(__file__)), 'data', 'defineV21-SDTM.xml') self.loader = LD.ODMLoader( DL.XMLDefineLoader(model_package="define_2_1", ns_uri="http://www.cdisc.org/ns/def/v2.1")) self.loader.open_odm_document(self.define_file) self.odm = self.loader.root() idx = self.odm.build_oid_index() found = idx.find_all("IG.VS") self.assertEqual(len(found), 1) self.assertEqual(found[0].ItemRef[2].ItemOID, "IT.USUBJID") self.assertEqual(found[0].ItemRef[5].ItemOID, "IT.VS.VSTEST") it_found = idx.find_all("IT.EX.EXSTDTC") self.assertEqual(len(it_found), 2) self.assertEqual(it_found[1].Name, "EXSTDTC")
def test_odm_round_trip(self): root = self.loader.open_odm_document(self.odm_file) odm = self.loader.create_odmlib(root) odm_json = odm.to_json() odm_json_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'data', 'sdtm_define2_test.json') with open(odm_json_file, "w") as odm_in: odm_in.write(odm_json) json_loader = LD.ODMLoader(OL.JSONDefineLoader()) odm_dict = json_loader.open_odm_document(odm_json_file) rt_odm = json_loader.create_odmlib(odm_dict, "ODM") def_xml_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'data', 'sdtm_def_test_roundtrip.xml') rt_odm.write_xml(def_xml_file) root2 = self.loader.open_odm_document(def_xml_file) odm2 = self.loader.create_odmlib(root2) self.assertEqual(odm2.Study[0].MetaDataVersion.OID, "MDV.CDISC01.SDTMIG.3.1.2.SDTM.1.2") print(f"ItemRefs = {len(odm2.Study[0].MetaDataVersion.ItemGroupDef[1])}") self.assertEqual(len(odm2.Study[0].MetaDataVersion.ItemGroupDef[1]), 6)
def setUp(self) -> None: self.odm_file_1 = os.path.join( os.path.dirname(os.path.realpath(__file__)), 'data', 'defineV21-SDTM-metadata.xml') NS.NamespaceRegistry(prefix="odm", uri="http://www.cdisc.org/ns/odm/v1.3", is_default=True) NS.NamespaceRegistry(prefix="def", uri="http://www.cdisc.org/ns/def/v2.1") self.nsr = NS.NamespaceRegistry( prefix="nciodm", uri="http://ncicb.nci.nih.gov/xml/odm/EVS/CDISC") self.parser = P.ODMParser(self.odm_file_1, self.nsr) self.loader = LD.ODMLoader( OL.XMLDefineLoader(model_package="define_2_1", ns_uri="http://www.cdisc.org/ns/def/v2.1")) self.root = self.loader.create_document(self.odm_file_1) self.odm = self.loader.load_odm() self.parser.parse() self.mdv = self.parser.MetaDataVersion()
def test_load_odm_xml_data_iterator(self): loader = LD.ODMLoader( OL.XMLODMLoader(model_package="odm_1_3_2", ns_uri="http://www.cdisc.org/ns/odm/v1.3")) loader.open_odm_document(self.odm_test_file2) odm = loader.load_odm() self.assertEqual(odm.FileOID, "Study-MetaD20220210213634") self.assertEqual(odm.ClinicalData[0].StudyOID, "1001_corona") igd_0 = odm.ClinicalData[0].SubjectData[0].StudyEventData[0].FormData[ 0].ItemGroupData[0] values = [] for item in igd_0: values.append(item.Value) test_values = self._get_test_values() self.assertListEqual(values, test_values) subjects = [] for subject in odm.ClinicalData[0]: subjects.append(subject.SubjectKey) test_subjects = ["SS_0001", "SS_0002"] self.assertListEqual(subjects, test_subjects)
def test_write_json(self): attrs = self.set_itemgroupdef_attributes() igd = DEFINE.ItemGroupDef(**attrs) tt = DEFINE.TranslatedText( _content="this is the first test description", lang="en") desc = DEFINE.Description() desc.TranslatedText = [tt] igd.Description = desc ir_list = self.set_itemrefs() igd.ItemRef = ir_list self.create_odm_document_json(igd) loader = LD.ODMLoader(OL.JSONDefineLoader(model_package="define_2_1")) loader.open_odm_document(self.test_file_json) mdv = loader.MetaDataVersion() igd_list = mdv.ItemGroupDef igd = igd_list[0] self.assertEqual(igd.OID, "IG.VS") # tests the __len__ in ItemGroupDef self.assertEqual(len(igd.ItemRef), 10)
def test_odm_ns_attributes(self): odm_test_file = os.path.join( os.path.dirname(os.path.realpath(__file__)), 'data', 'test_odm_namespace.xml') NS.NamespaceRegistry(prefix="def", uri="http://www.cdisc.org/ns/def/v2.0") NS.NamespaceRegistry(prefix="nciodm", uri="http://ncicb.nci.nih.gov/xml/odm/EVS/CDISC") NS.NamespaceRegistry(prefix="xsi", uri="http://www.w3.org/2001/XMLSchema-instance") root = self.add_root() odm_xml = root.to_xml() nsr = NS.NamespaceRegistry() nsr.set_odm_namespace_attributes(odm_xml) tree = ET.ElementTree(odm_xml) tree.write(odm_test_file, xml_declaration=True, encoding='utf-8', method='xml', short_empty_elements=True) self.assertEqual("ODM.MDV.TEST.001", root.FileOID) loader = LD.ODMLoader(DL.XMLDefineLoader()) odm_root = loader.open_odm_document(odm_test_file) self.assertEqual("ODM.MDV.TEST.001", odm_root.attrib["FileOID"]) odm = loader.create_odmlib(odm_root) self.assertEqual("ODM.MDV.TEST.001", odm.FileOID) nsr2 = NS.NamespaceRegistry() namespaces = nsr2.get_odm_namespace_entries() expected_ns_list = [ 'xmlns=http://www.cdisc.org/ns/odm/v1.3', 'xmlns:xs=http://www.w3.org/2001/XMLSchema-instance', 'xmlns:xml=http://www.w3.org/XML/1998/namespace', 'xmlns:xlink=http://www.w3.org/1999/xlink', 'xmlns:def=http://www.cdisc.org/ns/def/v2.0', 'xmlns:nciodm=http://ncicb.nci.nih.gov/xml/odm/EVS/CDISC', 'xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance' ] self.assertListEqual(namespaces, expected_ns_list)
def test_unknown_loader(self): with self.assertRaises(TypeError): loader = LD.ODMLoader(self.test_mdv_find_by_OID())
def test_xml_to_string(self): current_datetime = datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc).isoformat() root = ODM.ODM(FileOID="ODM.DEMO.001", Granularity="Metadata", AsOfDateTime=current_datetime, CreationDateTime=current_datetime, ODMVersion="1.3.2", FileType="Snapshot", Originator="swhume", SourceSystem="odmlib", SourceSystemVersion="0.1") # create Study and add to ODM root.Study.append(ODM.Study(OID="ODM.GET.STARTED")) # create the global variables root.Study[0].GlobalVariables = ODM.GlobalVariables() root.Study[0].GlobalVariables.StudyName = ODM.StudyName(_content="Get Started with ODM XML") root.Study[0].GlobalVariables.StudyDescription = ODM.StudyDescription( _content="Demo to get started with odmlib") root.Study[0].GlobalVariables.ProtocolName = ODM.ProtocolName(_content="ODM XML Get Started") # create the MetaDataVersion root.Study[0].MetaDataVersion.append(ODM.MetaDataVersion(OID="MDV.DEMO-ODM-01", Name="Get Started MDV", Description="Get Started Demo")) # create Protocol p = ODM.Protocol() p.Description = ODM.Description() p.Description.TranslatedText.append(ODM.TranslatedText(_content="Get Started Protocol", lang="en")) p.StudyEventRef.append(ODM.StudyEventRef(StudyEventOID="BASELINE", OrderNumber=1, Mandatory="Yes")) root.Study[0].MetaDataVersion[0].Protocol = p # create a StudyEventDef sed = ODM.StudyEventDef(OID="BASELINE", Name="Baseline Visit", Repeating="No", Type="Scheduled") sed.FormRef.append(ODM.FormRef(FormOID="ODM.F.DM", Mandatory="Yes", OrderNumber=1)) root.Study[0].MetaDataVersion[0].StudyEventDef.append(sed) # create a FormDef fd = ODM.FormDef(OID="ODM.F.DM", Name="Demographics", Repeating="No") fd.ItemGroupRef.append(ODM.ItemGroupRef(ItemGroupOID="ODM.IG.DM", Mandatory="Yes", OrderNumber=2)) root.Study[0].MetaDataVersion[0].FormDef.append(fd) # create an ItemGroupDef igd = ODM.ItemGroupDef(OID="ODM.IG.DM", Name="Demographics", Repeating="No") igd.ItemRef.append(ODM.ItemRef(ItemOID="ODM.IT.DM.BRTHYR", Mandatory="Yes")) root.Study[0].MetaDataVersion[0].ItemGroupDef.append(igd) # create an ItemDef itd = ODM.ItemDef(OID="ODM.IT.DM.BRTHYR", Name="Birth Year", DataType="integer") itd.Description = ODM.Description() itd.Description.TranslatedText.append(ODM.TranslatedText(_content="Year of the subject's birth", lang="en")) itd.Question = ODM.Question() itd.Question.TranslatedText.append(ODM.TranslatedText(_content="Birth Year", lang="en")) itd.Alias.append(ODM.Alias(Context="CDASH", Name="BRTHYR")) itd.Alias.append(ODM.Alias(Context="SDTM", Name="BRTHDTC")) root.Study[0].MetaDataVersion[0].ItemDef.append(itd) odm_xml_string = root.to_xml_string() # add namespaces nsr = NS.NamespaceRegistry() odm_str = nsr.set_odm_namespace_attributes_string(odm_xml_string) with open("./data/simple_create_from_string.xml", "w") as xml_file: xml_file.write(odm_str) loader = LD.ODMLoader(OL.XMLODMLoader(model_package="odm_1_3_2", ns_uri="http://www.cdisc.org/ns/odm/v1.3")) loader.open_odm_document("./data/simple_create_from_string.xml") mdv = loader.MetaDataVersion() item_list = mdv.ItemDef item = item_list[0] self.assertEqual(item.OID, "ODM.IT.DM.BRTHYR")
def setUp(self) -> None: self.odm_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'data', 'define2-0-0-sdtm-test.xml') self.odm_file_json = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'data', 'sdtm_define2_test.json') self.loader = LD.ODMLoader(OL.XMLDefineLoader()) self.jloader = LD.ODMLoader(OL.JSONDefineLoader())