diff --git a/src/pynwb/io/device.py b/src/pynwb/io/device.py index b07191268..604a7fc8c 100644 --- a/src/pynwb/io/device.py +++ b/src/pynwb/io/device.py @@ -5,6 +5,13 @@ from .core import NWBContainerMapper +def _construct_legacy_device_model(**kwargs): + model = DeviceModel.__new__(DeviceModel, in_construct_mode=True) + model.__init__(**kwargs) + model._in_construct_mode = False + return model + + @register_map(Device) class DeviceMapper(NWBContainerMapper): """ @@ -38,7 +45,7 @@ def model_carg(self, builder, manager): description=builder.attributes.get('description'), manufacturer=builder.attributes.get('manufacturer', ''), model_number=builder.attributes.get('model_number')) - model = DeviceModel(**device_model_attributes) + model = _construct_legacy_device_model(**device_model_attributes) return model diff --git a/tests/unit/test_device.py b/tests/unit/test_device.py index 91af24d81..e1c599881 100644 --- a/tests/unit/test_device.py +++ b/tests/unit/test_device.py @@ -1,7 +1,17 @@ from pynwb.device import Device, DeviceModel +from pynwb.io.device import DeviceMapper from pynwb.testing import TestCase +class DeviceBuilder(dict): + + attributes = { + 'description': 'device description', + 'manufacturer': 'manufacturer', + 'model_number': 'model_number', + } + + class TestDevice(TestCase): def test_init(self): @@ -77,3 +87,21 @@ def test_init(self): self.assertEqual(device_model.manufacturer, 'manufacturer') self.assertEqual(device_model.model_number, 'model_number') self.assertEqual(device_model.description, 'description') + + +class TestDeviceMapper(TestCase): + + def test_model_carg_preserves_legacy_model_name(self): + builder = DeviceBuilder(model='MFC_200/250-0.66_40mm_MF2.5:FLT') + msg = ( + 'Device.model was detected as a string, but NWB 2.9 specifies Device.model as a link to a DeviceModel. ' + 'Remapping "MFC_200/250-0.66_40mm_MF2.5:FLT" to a new DeviceModel.' + ) + with self.assertWarnsWith(UserWarning, msg): + device_model = DeviceMapper.model_carg(None, builder, None) + + self.assertIsInstance(device_model, DeviceModel) + self.assertEqual(device_model.name, 'MFC_200/250-0.66_40mm_MF2.5:FLT') + self.assertEqual(device_model.description, 'device description') + self.assertEqual(device_model.manufacturer, 'manufacturer') + self.assertEqual(device_model.model_number, 'model_number')