From cec8971d3102317f2c3e069d2a3e90a22a725e8c Mon Sep 17 00:00:00 2001 From: Ryan Ly Date: Tue, 21 Jan 2020 19:35:44 -0800 Subject: [PATCH] Use HDMF 1.5.4 (#1154) * Use HDMF 1.5.4 * Rename mixin classes to not start with Test* (#1153) * Rename mixin classes to not start with Test* * flake8 fix * Use hdmf 1.5.4 * Use hdmf 1.5.4 * Add version to NWBNamespaceBuilder tests * Add version to NWBNamespaceBuilder in extensions tutorial * Add version 1.1.2 files for backwards compatibility tests --- docs/gallery/general/extensions.py | 6 ++--- docs/source/extensions.rst | 2 +- requirements-min.txt | 2 +- requirements.txt | 2 +- src/pynwb/testing/__init__.py | 4 ++-- src/pynwb/testing/testh5io.py | 12 +++++----- tests/back_compat/1.1.2_nwbfile.nwb | Bin 0 -> 148288 bytes tests/back_compat/1.1.2_str_experimenter.nwb | Bin 0 -> 148880 bytes tests/back_compat/1.1.2_str_pub.nwb | Bin 0 -> 148880 bytes tests/integration/hdf5/test_base.py | 4 ++-- tests/integration/hdf5/test_device.py | 4 ++-- tests/integration/hdf5/test_ecephys.py | 22 +++++++++---------- tests/integration/hdf5/test_icephys.py | 12 +++++----- tests/integration/hdf5/test_image.py | 4 ++-- tests/integration/hdf5/test_misc.py | 8 +++---- tests/integration/hdf5/test_nwbfile.py | 22 +++++++++---------- tests/integration/hdf5/test_ogen.py | 6 ++--- tests/integration/hdf5/test_ophys.py | 10 ++++----- tests/integration/hdf5/test_scratch.py | 4 ++-- tests/unit/test_extension.py | 17 +++++++------- 20 files changed, 69 insertions(+), 72 deletions(-) create mode 100644 tests/back_compat/1.1.2_nwbfile.nwb create mode 100644 tests/back_compat/1.1.2_str_experimenter.nwb create mode 100644 tests/back_compat/1.1.2_str_pub.nwb diff --git a/docs/gallery/general/extensions.py b/docs/gallery/general/extensions.py index e5aa029b2..403482d2c 100644 --- a/docs/gallery/general/extensions.py +++ b/docs/gallery/general/extensions.py @@ -35,7 +35,7 @@ ns_path = "mylab.namespace.yaml" ext_source = "mylab.extensions.yaml" -ns_builder = NWBNamespaceBuilder('Extension for use in my Lab', "mylab") +ns_builder = NWBNamespaceBuilder('Extension for use in my Lab', "mylab", version='0.1.0') ns_builder.include_type('ElectricalSeries', namespace='core') @@ -252,7 +252,7 @@ def __init__(self, **kwargs): ns_path = name + ".namespace.yaml" ext_source = name + ".extensions.yaml" -ns_builder = NWBNamespaceBuilder(name + ' extensions', name) +ns_builder = NWBNamespaceBuilder(name + ' extensions', name, version='0.1.0') ns_builder.include_type('NWBDataInterface', namespace='core') potato = NWBGroupSpec(neurodata_type_def='Potato', @@ -387,7 +387,7 @@ class PotatoSack(MultiContainerInterface): # Now we set up the builder and add this object -ns_builder = NWBNamespaceBuilder(name + ' extensions', name) +ns_builder = NWBNamespaceBuilder(name + ' extensions', name, version='0.1.0') ns_builder.add_spec(ext_source, surface) ns_builder.export(ns_path) diff --git a/docs/source/extensions.rst b/docs/source/extensions.rst index e263ee4f8..fae59fcbe 100644 --- a/docs/source/extensions.rst +++ b/docs/source/extensions.rst @@ -166,7 +166,7 @@ Create a new namespace with extensions from pynwb.spec import NWBGroupSpec, NWBNamespaceBuilder # create a builder for the namespace - ns_builder = NWBNamespaceBuilder("Extension for use in my laboratory", "mylab", ...) + ns_builder = NWBNamespaceBuilder("Extension for use in my laboratory", "mylab", version='0.1.0', ...) # create extensions ext1 = NWBGroupSpec('A custom SpikeEventSeries interface', diff --git a/requirements-min.txt b/requirements-min.txt index 74419aeba..d462a1954 100644 --- a/requirements-min.txt +++ b/requirements-min.txt @@ -1,6 +1,6 @@ # these minimum requirements specify '==' for testing; setup.py replaces '==' with '>=' h5py==2.9 # support for setting attrs to lists of utf-8 added in 2.9 -hdmf==1.5.3,<2 +hdmf==1.5.4,<2 numpy==1.16 pandas==0.23 python-dateutil==2.7 diff --git a/requirements.txt b/requirements.txt index d2dc29e27..3d8d7d180 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ h5py==2.10.0 -hdmf==1.5.3 +hdmf==1.5.4 numpy==1.18.1 pandas==0.25.3 python-dateutil==2.8.0 diff --git a/src/pynwb/testing/__init__.py b/src/pynwb/testing/__init__.py index 248a162fe..fa8eb5c7c 100644 --- a/src/pynwb/testing/__init__.py +++ b/src/pynwb/testing/__init__.py @@ -1,5 +1,5 @@ -from hdmf.testing import TestCase, TestH5RoundTripMixin -from .testh5io import TestNWBH5IOMixin, TestAcquisitionH5IOMixin +from hdmf.testing import TestCase, H5RoundTripMixin +from .testh5io import NWBH5IOMixin, AcquisitionH5IOMixin from .utils import remove_test_file CORE_NAMESPACE = 'core' diff --git a/src/pynwb/testing/testh5io.py b/src/pynwb/testing/testh5io.py index 6160d64f8..9db958fbd 100644 --- a/src/pynwb/testing/testh5io.py +++ b/src/pynwb/testing/testh5io.py @@ -10,7 +10,7 @@ from hdmf.build.warnings import MissingRequiredWarning, OrphanContainerWarning -class TestNWBH5IOMixin(metaclass=ABCMeta): +class NWBH5IOMixin(metaclass=ABCMeta): """ Mixin class for methods to run a roundtrip test writing an NWB file with an Container and reading the Container from the NWB file. The setUp, test_roundtrip, and tearDown methods will be run by unittest. @@ -19,7 +19,7 @@ class TestNWBH5IOMixin(metaclass=ABCMeta): this mixin. Example: - class TestMyContainerIO(TestNWBH5IOMixin, TestCase): + class TestMyContainerIO(NWBH5IOMixin, TestCase): def setUpContainer(self): # return a test Container to read/write def addContainer(self, nwbfile): @@ -27,7 +27,7 @@ def addContainer(self, nwbfile): def getContainer(self, nwbfile): # return the test Container from an NWB file - This code is adapted from hdmf.testing.TestH5RoundTripMixin. + This code is adapted from hdmf.testing.H5RoundTripMixin. """ def setUp(self): @@ -120,7 +120,7 @@ def validate(self): raise Exception(err) -class TestAcquisitionH5IOMixin(TestNWBH5IOMixin): +class AcquisitionH5IOMixin(NWBH5IOMixin): """ Mixin class for methods to run a roundtrip test writing an NWB file with an Container as an acquisition and reading the Container as an acquisition from the NWB file. The setUp, test_roundtrip, and tearDown methods will be run by @@ -129,11 +129,11 @@ class TestAcquisitionH5IOMixin(TestNWBH5IOMixin): The abstract method setUpContainer needs to be implemented by classes that include this mixin. Example: - class TestMyContainerIO(TestNWBH5IOMixin, TestCase): + class TestMyContainerIO(NWBH5IOMixin, TestCase): def setUpContainer(self): # return a test Container to read/write - This code is adapted from hdmf.testing.TestH5RoundTripMixin. + This code is adapted from hdmf.testing.H5RoundTripMixin. """ def addContainer(self, nwbfile): diff --git a/tests/back_compat/1.1.2_nwbfile.nwb b/tests/back_compat/1.1.2_nwbfile.nwb new file mode 100644 index 0000000000000000000000000000000000000000..93a43384b60b8a7934f940485f5dcf64883b3407 GIT binary patch literal 148288 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 KA@Ik6z<&cldAV@_ literal 0 HcmV?d00001 diff --git a/tests/back_compat/1.1.2_str_experimenter.nwb b/tests/back_compat/1.1.2_str_experimenter.nwb new file mode 100644 index 0000000000000000000000000000000000000000..ad09981b3c2939652ec62612a022080e06f68c08 GIT binary patch literal 148880 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 Lv=I2+K;Zue0FlLJ literal 0 HcmV?d00001 diff --git a/tests/integration/hdf5/test_base.py b/tests/integration/hdf5/test_base.py index 5769e67c9..f0057ac13 100644 --- a/tests/integration/hdf5/test_base.py +++ b/tests/integration/hdf5/test_base.py @@ -3,10 +3,10 @@ from dateutil.tz import tzlocal from pynwb import TimeSeries, NWBFile, NWBHDF5IO -from pynwb.testing import TestAcquisitionH5IOMixin, TestCase +from pynwb.testing import AcquisitionH5IOMixin, TestCase -class TestTimeSeriesIO(TestAcquisitionH5IOMixin, TestCase): +class TestTimeSeriesIO(AcquisitionH5IOMixin, TestCase): def setUpContainer(self): """ Return the test TimeSeries to read/write """ diff --git a/tests/integration/hdf5/test_device.py b/tests/integration/hdf5/test_device.py index 23843d5d1..f26a3df1b 100644 --- a/tests/integration/hdf5/test_device.py +++ b/tests/integration/hdf5/test_device.py @@ -1,8 +1,8 @@ from pynwb.device import Device -from pynwb.testing import TestNWBH5IOMixin, TestCase +from pynwb.testing import NWBH5IOMixin, TestCase -class TestDeviceIO(TestNWBH5IOMixin, TestCase): +class TestDeviceIO(NWBH5IOMixin, TestCase): def setUpContainer(self): """ Return the test Device to read/write """ diff --git a/tests/integration/hdf5/test_ecephys.py b/tests/integration/hdf5/test_ecephys.py index 2bdebe883..d31e52490 100644 --- a/tests/integration/hdf5/test_ecephys.py +++ b/tests/integration/hdf5/test_ecephys.py @@ -4,10 +4,10 @@ SpikeEventSeries, EventWaveform, EventDetection, FeatureExtraction from pynwb.device import Device from pynwb.file import ElectrodeTable as get_electrode_table -from pynwb.testing import TestNWBH5IOMixin, TestAcquisitionH5IOMixin, TestCase +from pynwb.testing import NWBH5IOMixin, AcquisitionH5IOMixin, TestCase -class TestElectrodeGroupIO(TestNWBH5IOMixin, TestCase): +class TestElectrodeGroupIO(NWBH5IOMixin, TestCase): def setUpContainer(self): """ Return the test ElectrodeGroup to read/write """ @@ -25,7 +25,7 @@ def getContainer(self, nwbfile): return nwbfile.get_electrode_group(self.container.name) -class TestElectricalSeriesIO(TestAcquisitionH5IOMixin, TestCase): +class TestElectricalSeriesIO(AcquisitionH5IOMixin, TestCase): @staticmethod def make_electrode_table(self): @@ -66,7 +66,7 @@ def test_eg_ref(self): self.assertIsInstance(row2.iloc[0]['group'], ElectrodeGroup) -class TestMultiElectricalSeriesIOMixin(TestAcquisitionH5IOMixin): +class MultiElectricalSeriesIOMixin(AcquisitionH5IOMixin): """ Mixin class for methods to run a roundtrip test writing an NWB file with multiple ElectricalSeries. @@ -95,7 +95,7 @@ def addContainer(self, nwbfile): nwbfile.add_acquisition(self.container) -class TestLFPIO(TestMultiElectricalSeriesIOMixin, TestCase): +class TestLFPIO(MultiElectricalSeriesIOMixin, TestCase): def setUpContainer(self): """ Return a test LFP to read/write """ @@ -104,7 +104,7 @@ def setUpContainer(self): return lfp -class TestFilteredEphysIO(TestMultiElectricalSeriesIOMixin, TestCase): +class TestFilteredEphysIO(MultiElectricalSeriesIOMixin, TestCase): def setUpContainer(self): """ Return a test FilteredEphys to read/write """ @@ -113,7 +113,7 @@ def setUpContainer(self): return fe -class TestClusteringIO(TestAcquisitionH5IOMixin, TestCase): +class TestClusteringIO(AcquisitionH5IOMixin, TestCase): def setUpContainer(self): """ Return a test Clustering to read/write """ @@ -127,7 +127,7 @@ def roundtripContainer(self, cache_spec=False): return super().roundtripContainer(cache_spec) -class EventWaveformConstructor(TestAcquisitionH5IOMixin, TestCase): +class EventWaveformConstructor(AcquisitionH5IOMixin, TestCase): def setUpContainer(self): """ Return a test EventWaveform to read/write """ @@ -145,7 +145,7 @@ def addContainer(self, nwbfile): nwbfile.add_acquisition(self.container) -class ClusterWaveformsConstructor(TestAcquisitionH5IOMixin, TestCase): +class ClusterWaveformsConstructor(AcquisitionH5IOMixin, TestCase): def setUpContainer(self): """ Return a test ClusterWaveforms to read/write """ @@ -171,7 +171,7 @@ def roundtripContainer(self, cache_spec=False): return super().roundtripContainer(cache_spec) -class FeatureExtractionConstructor(TestAcquisitionH5IOMixin, TestCase): +class FeatureExtractionConstructor(AcquisitionH5IOMixin, TestCase): def setUpContainer(self): """ Return a test FeatureExtraction to read/write """ @@ -191,7 +191,7 @@ def addContainer(self, nwbfile): nwbfile.add_acquisition(self.container) -class EventDetectionConstructor(TestAcquisitionH5IOMixin, TestCase): +class EventDetectionConstructor(AcquisitionH5IOMixin, TestCase): def setUpContainer(self): """ Return a test EventDetection to read/write """ diff --git a/tests/integration/hdf5/test_icephys.py b/tests/integration/hdf5/test_icephys.py index f7d9c0899..d009b105c 100644 --- a/tests/integration/hdf5/test_icephys.py +++ b/tests/integration/hdf5/test_icephys.py @@ -1,14 +1,12 @@ -from abc import ABCMeta - from pynwb import NWBFile from pynwb.icephys import (IntracellularElectrode, PatchClampSeries, CurrentClampStimulusSeries, SweepTable, VoltageClampStimulusSeries, CurrentClampSeries, VoltageClampSeries, IZeroClampSeries) from pynwb.device import Device -from pynwb.testing import TestNWBH5IOMixin, TestAcquisitionH5IOMixin, TestCase +from pynwb.testing import NWBH5IOMixin, AcquisitionH5IOMixin, TestCase -class TestIntracellularElectrode(TestNWBH5IOMixin, TestCase): +class TestIntracellularElectrode(NWBH5IOMixin, TestCase): def setUpContainer(self): """ Return the test IntracellularElectrode to read/write """ @@ -32,7 +30,7 @@ def getContainer(self, nwbfile): return nwbfile.get_ic_electrode(self.container.name) -class TestPatchClampSeries(TestAcquisitionH5IOMixin, metaclass=ABCMeta): +class TestPatchClampSeries(AcquisitionH5IOMixin, TestCase): def setUpElectrode(self): """ Set up the test IntracellularElectrode """ @@ -111,7 +109,7 @@ def setUpContainer(self): starting_time=123.6, rate=10e3, electrode=self.elec, gain=0.126) -class TestSweepTableRoundTripEasy(TestNWBH5IOMixin, TestCase): +class TestSweepTableRoundTripEasy(NWBH5IOMixin, TestCase): def setUpContainer(self): """ Return the test SweepTable to read/write """ @@ -154,7 +152,7 @@ def test_container(self): self.assertEqual(sweep_table['sweep_number'].data[0], 4711) -class TestSweepTableRoundTripComplicated(TestNWBH5IOMixin, TestCase): +class TestSweepTableRoundTripComplicated(NWBH5IOMixin, TestCase): def setUpContainer(self): """ Return the test SweepTable to read/write """ diff --git a/tests/integration/hdf5/test_image.py b/tests/integration/hdf5/test_image.py index fce73f195..29cdd83b9 100644 --- a/tests/integration/hdf5/test_image.py +++ b/tests/integration/hdf5/test_image.py @@ -1,10 +1,10 @@ import numpy as np from pynwb.image import OpticalSeries -from pynwb.testing import TestNWBH5IOMixin, TestCase +from pynwb.testing import NWBH5IOMixin, TestCase -class TestOpticalSeriesIO(TestNWBH5IOMixin, TestCase): +class TestOpticalSeriesIO(NWBH5IOMixin, TestCase): def setUpContainer(self): """ Return a test OpticalSeries to read/write """ diff --git a/tests/integration/hdf5/test_misc.py b/tests/integration/hdf5/test_misc.py index 63244b0fa..74eb0e973 100644 --- a/tests/integration/hdf5/test_misc.py +++ b/tests/integration/hdf5/test_misc.py @@ -3,10 +3,10 @@ from hdmf.common import DynamicTable, VectorData from pynwb import TimeSeries from pynwb.misc import Units, DecompositionSeries -from pynwb.testing import TestNWBH5IOMixin, TestAcquisitionH5IOMixin, TestCase +from pynwb.testing import NWBH5IOMixin, AcquisitionH5IOMixin, TestCase -class TestUnitsIO(TestAcquisitionH5IOMixin, TestCase): +class TestUnitsIO(AcquisitionH5IOMixin, TestCase): """ Test adding Units into acquisition and accessing Units after read """ def setUpContainer(self): @@ -35,7 +35,7 @@ def test_get_obs_intervals(self): self.assertTrue(np.array_equal(ut['obs_intervals'][:], [[[0, 1], [2, 3]], [[2, 5], [6, 7]]])) -class TestUnitsFileIO(TestNWBH5IOMixin, TestCase): +class TestUnitsFileIO(NWBH5IOMixin, TestCase): def setUpContainer(self): """ Return placeholder Units object. Tested units are added directly to the NWBFile in addContainer """ @@ -71,7 +71,7 @@ def test_to_dataframe(self): units.to_dataframe() -class TestDecompositionSeriesIO(TestNWBH5IOMixin, TestCase): +class TestDecompositionSeriesIO(NWBH5IOMixin, TestCase): def setUpContainer(self): """ Return the test DecompositionSeries to read/write """ diff --git a/tests/integration/hdf5/test_nwbfile.py b/tests/integration/hdf5/test_nwbfile.py index 0bce5d2df..7cb9699e2 100644 --- a/tests/integration/hdf5/test_nwbfile.py +++ b/tests/integration/hdf5/test_nwbfile.py @@ -10,7 +10,7 @@ from pynwb.file import Subject from pynwb.epoch import TimeIntervals from pynwb.ecephys import ElectricalSeries -from pynwb.testing import TestNWBH5IOMixin, TestCase, remove_test_file +from pynwb.testing import NWBH5IOMixin, TestCase, remove_test_file class TestNWBFileHDF5IO(TestCase): @@ -89,9 +89,9 @@ def test_read(self): hdf5io.close() -class TestNWBFileIO(TestNWBH5IOMixin, TestCase): +class TestNWBFileIO(NWBH5IOMixin, TestCase): """ Test writing an NWBFile to disk and reading back the file """ - # this uses methods tearDown, test_roundtrip, and validate from TestNWBH5IOMixin. the rest are overridden + # this uses methods tearDown, test_roundtrip, and validate from NWBH5IOMixin. the rest are overridden def setUp(self): super().setUp() @@ -190,7 +190,7 @@ def build_nwbfile(self): self.nwbfile.related_publications = ('pub1', 'pub2') -class TestSubjectIO(TestNWBH5IOMixin, TestCase): +class TestSubjectIO(NWBH5IOMixin, TestCase): def setUpContainer(self): """ Return the test Subject """ @@ -218,7 +218,7 @@ def setUpContainer(self): return Subject() -class TestEpochsIO(TestNWBH5IOMixin, TestCase): +class TestEpochsIO(NWBH5IOMixin, TestCase): def setUpContainer(self): """ Return placeholder epochs object. Tested epochs are added directly to the NWBFile in addContainer """ @@ -335,7 +335,7 @@ def test_df_comparison_no_ts(self): pd.testing.assert_frame_equal(df_exp, df_obt, check_like=True, check_dtype=False) -class TestTrials(TestNWBH5IOMixin, TestCase): +class TestTrials(NWBH5IOMixin, TestCase): def setUpContainer(self): """ Return placeholder Table for trials. Tested trials are added directly to the NWBFile in addContainer """ @@ -357,7 +357,7 @@ def getContainer(self, nwbfile): return nwbfile.trials -class TestInvalidTimes(TestNWBH5IOMixin, TestCase): +class TestInvalidTimes(NWBH5IOMixin, TestCase): def setUpContainer(self): """ @@ -381,7 +381,7 @@ def getContainer(self, nwbfile): return nwbfile.invalid_times -class TestUnits(TestNWBH5IOMixin, TestCase): +class TestUnits(NWBH5IOMixin, TestCase): def setUpContainer(self): """ Return placeholder table for Units. Tested units are added directly to the NWBFile in addContainer """ @@ -401,7 +401,7 @@ def getContainer(self, nwbfile): return nwbfile.units -class TestDynamicTableFromDataframeIO(TestNWBH5IOMixin, TestCase): +class TestDynamicTableFromDataframeIO(NWBH5IOMixin, TestCase): def setUpContainer(self): return DynamicTable.from_dataframe(pd.DataFrame({ @@ -424,7 +424,7 @@ def test_to_dataframe(self): dyn_tab.to_dataframe() # also test 2D column round-trip -class TestElectrodes(TestNWBH5IOMixin, TestCase): +class TestElectrodes(NWBH5IOMixin, TestCase): def setUpContainer(self): """ @@ -460,7 +460,7 @@ def test_roundtrip(self): self.container[0].drop('group', axis=1)) -class TestElectrodesRegion(TestNWBH5IOMixin, TestCase): +class TestElectrodesRegion(NWBH5IOMixin, TestCase): def setUpContainer(self): """ diff --git a/tests/integration/hdf5/test_ogen.py b/tests/integration/hdf5/test_ogen.py index b4b3b498d..e006fef77 100644 --- a/tests/integration/hdf5/test_ogen.py +++ b/tests/integration/hdf5/test_ogen.py @@ -1,9 +1,9 @@ from pynwb.ogen import OptogeneticSeries, OptogeneticStimulusSite from pynwb.device import Device -from pynwb.testing import TestNWBH5IOMixin, TestAcquisitionH5IOMixin, TestCase +from pynwb.testing import NWBH5IOMixin, AcquisitionH5IOMixin, TestCase -class TestOptogeneticStimulusSiteIO(TestNWBH5IOMixin, TestCase): +class TestOptogeneticStimulusSiteIO(NWBH5IOMixin, TestCase): def setUpContainer(self): """ Return the test OptogeneticStimulusSite to read/write """ @@ -20,7 +20,7 @@ def getContainer(self, nwbfile): return nwbfile.get_ogen_site(self.container.name) -class TestOptogeneticSeriesIO(TestAcquisitionH5IOMixin, TestCase): +class TestOptogeneticSeriesIO(AcquisitionH5IOMixin, TestCase): def setUpContainer(self): """ Return the test OptogeneticSeries to read/write """ diff --git a/tests/integration/hdf5/test_ophys.py b/tests/integration/hdf5/test_ophys.py index 8650c7413..881cbcf90 100644 --- a/tests/integration/hdf5/test_ophys.py +++ b/tests/integration/hdf5/test_ophys.py @@ -11,10 +11,10 @@ ) from pynwb.image import ImageSeries from pynwb.device import Device -from pynwb.testing import TestNWBH5IOMixin, TestAcquisitionH5IOMixin, TestCase +from pynwb.testing import NWBH5IOMixin, AcquisitionH5IOMixin, TestCase -class TestImagingPlaneIO(TestNWBH5IOMixin, TestCase): +class TestImagingPlaneIO(NWBH5IOMixin, TestCase): def setUpContainer(self): """ Return the test ImagingPlane to read/write """ @@ -33,7 +33,7 @@ def getContainer(self, nwbfile): return nwbfile.get_imaging_plane(self.container.name) -class TestTwoPhotonSeriesIO(TestAcquisitionH5IOMixin, TestCase): +class TestTwoPhotonSeriesIO(AcquisitionH5IOMixin, TestCase): def make_imaging_plane(self): """ Make an ImagingPlane and related objects """ @@ -59,7 +59,7 @@ def addContainer(self, nwbfile): nwbfile.add_acquisition(self.container) -class TestPlaneSegmentationIO(TestNWBH5IOMixin, TestCase): +class TestPlaneSegmentationIO(NWBH5IOMixin, TestCase): @staticmethod def buildPlaneSegmentation(self): @@ -164,7 +164,7 @@ def setUpContainer(self): return pS -class TestRoiResponseSeriesIO(TestAcquisitionH5IOMixin, TestCase): +class TestRoiResponseSeriesIO(AcquisitionH5IOMixin, TestCase): def setUpContainer(self): """ Return the test RoiResponseSeries to read/write """ diff --git a/tests/integration/hdf5/test_scratch.py b/tests/integration/hdf5/test_scratch.py index 24ab46880..c6699db52 100644 --- a/tests/integration/hdf5/test_scratch.py +++ b/tests/integration/hdf5/test_scratch.py @@ -4,10 +4,10 @@ from pynwb import NWBFile, NWBHDF5IO, TimeSeries from pynwb.core import ScratchData -from pynwb.testing import TestNWBH5IOMixin, TestCase +from pynwb.testing import NWBH5IOMixin, TestCase -class TestScratchDataIO(TestNWBH5IOMixin, TestCase): +class TestScratchDataIO(NWBH5IOMixin, TestCase): def setUpContainer(self): """ Return the test ScratchData to read/write """ diff --git a/tests/unit/test_extension.py b/tests/unit/test_extension.py index 486e96ba9..68f547aff 100644 --- a/tests/unit/test_extension.py +++ b/tests/unit/test_extension.py @@ -34,7 +34,7 @@ def tearDown(self): os.remove(path) def test_export(self): - ns_builder = NWBNamespaceBuilder('Extension for use in my Lab', self.prefix) + ns_builder = NWBNamespaceBuilder('Extension for use in my Lab', self.prefix, version='0.1.0') ext1 = NWBGroupSpec('A custom ElectricalSeries for my lab', attributes=[NWBAttributeSpec(name='trode_id', doc='the tetrode id', dtype='int')], neurodata_type_inc='ElectricalSeries', @@ -52,7 +52,7 @@ def test_get_class(self): type_map.get_container_cls(self.prefix, 'TetrodeSeries') def test_load_namespace_with_reftype_attribute(self): - ns_builder = NWBNamespaceBuilder('Extension for use in my Lab', self.prefix) + ns_builder = NWBNamespaceBuilder('Extension for use in my Lab', self.prefix, version='0.1.0') test_ds_ext = NWBDatasetSpec(doc='test dataset to add an attr', name='test_data', shape=(None,), attributes=[NWBAttributeSpec(name='target_ds', @@ -64,7 +64,7 @@ def test_load_namespace_with_reftype_attribute(self): get_type_map(extensions=os.path.join(self.tempdir, self.ns_path)) def test_load_namespace_with_reftype_attribute_check_autoclass_const(self): - ns_builder = NWBNamespaceBuilder('Extension for use in my Lab', self.prefix) + ns_builder = NWBNamespaceBuilder('Extension for use in my Lab', self.prefix, version='0.1.0') test_ds_ext = NWBDatasetSpec(doc='test dataset to add an attr', name='test_data', shape=(None,), attributes=[NWBAttributeSpec(name='target_ds', @@ -84,7 +84,7 @@ def test_load_namespace_with_reftype_attribute_check_autoclass_const(self): self.assertEqual(docval['type'], TimeSeries) def test_lab_meta(self): - ns_builder = NWBNamespaceBuilder('Extension for use in my Lab', self.prefix) + ns_builder = NWBNamespaceBuilder('Extension for use in my Lab', self.prefix, version='0.1.0') test_meta_ext = NWBGroupSpec( neurodata_type_def='MyTestMetaData', neurodata_type_inc='LabMetaData', @@ -113,7 +113,7 @@ def __init__(self, **kwargs): nwbfile.add_lab_meta_data(MyTestMetaData(name='test_name', test_attr=5.)) def test_lab_meta_auto(self): - ns_builder = NWBNamespaceBuilder('Extension for use in my Lab', self.prefix) + ns_builder = NWBNamespaceBuilder('Extension for use in my Lab', self.prefix, version='0.1.0') test_meta_ext = NWBGroupSpec( neurodata_type_def='MyTestMetaData', neurodata_type_inc='LabMetaData', @@ -153,14 +153,14 @@ def tearDown(self): os.remove(path) def test_catch_dup_name(self): - ns_builder1 = NWBNamespaceBuilder('Extension for us in my Lab', "pynwb_test_extension1") + ns_builder1 = NWBNamespaceBuilder('Extension for us in my Lab', "pynwb_test_extension1", version='0.1.0') ext1 = NWBGroupSpec('A custom ElectricalSeries for my lab', attributes=[NWBAttributeSpec(name='trode_id', doc='the tetrode id', dtype='int')], neurodata_type_inc='ElectricalSeries', neurodata_type_def='TetrodeSeries') ns_builder1.add_spec(self.ext_source1, ext1) ns_builder1.export(self.ns_path1, outdir=self.tempdir) - ns_builder2 = NWBNamespaceBuilder('Extension for us in my Lab', "pynwb_test_extension1") + ns_builder2 = NWBNamespaceBuilder('Extension for us in my Lab', "pynwb_test_extension1", version='0.1.0') ext2 = NWBGroupSpec('A custom ElectricalSeries for my lab', attributes=[NWBAttributeSpec(name='trode_id', doc='the tetrode id', dtype='int')], neurodata_type_inc='ElectricalSeries', @@ -191,8 +191,7 @@ def test_catch_duplicate_spec(self): groups=[spec1], neurodata_type_inc="NWBDataInterface", neurodata_type_def="Group2") - ns_builder = NWBNamespaceBuilder("Example namespace", - "pynwb_test_ext") + ns_builder = NWBNamespaceBuilder("Example namespace", "pynwb_test_ext", version='0.1.0') ns_builder.add_spec(self.ext_source, spec1) with self.assertRaises(ValueError): ns_builder.add_spec(self.ext_source, spec2)