Skip to content
Draft
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
9 changes: 8 additions & 1 deletion src/pynwb/io/device.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
"""
Expand Down Expand Up @@ -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

Expand Down
28 changes: 28 additions & 0 deletions tests/unit/test_device.py
Original file line number Diff line number Diff line change
@@ -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):
Expand Down Expand Up @@ -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')
Loading