From 1e6a51304e598a1f2eca61c2feba9dd73e86864b Mon Sep 17 00:00:00 2001 From: Ryan Ly Date: Wed, 22 Jan 2020 15:09:08 -0800 Subject: [PATCH 1/5] Fix #1157 --- src/pynwb/validate.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pynwb/validate.py b/src/pynwb/validate.py index 646e8f4b8..bc2358b1a 100644 --- a/src/pynwb/validate.py +++ b/src/pynwb/validate.py @@ -7,7 +7,7 @@ from hdmf.build import TypeMap as TypeMap from hdmf.backends.hdf5 import HDF5IO -from pynwb import validate, available_namespaces, NWBHDF5IO +from pynwb import validate, CORE_NAMESPACE, NWBHDF5IO from pynwb.spec import NWBDatasetSpec, NWBGroupSpec, NWBNamespace @@ -75,7 +75,7 @@ def main(): specloc = "cached namespace information" else: manager = None - namespaces = available_namespaces() + namespaces = [CORE_NAMESPACE] specloc = "pynwb namespace information" print("The file {} has no cached namespace information. " "Falling back to {}.".format(path, specloc), file=sys.stderr) @@ -92,7 +92,7 @@ def main(): specloc = "--nspath namespace information" else: manager = None - namespaces = available_namespaces() + namespaces = [CORE_NAMESPACE] specloc = "pynwb namespace information" if args.ns: From 8074fa8034615a84ac08fc16f1b45d4b94a89f22 Mon Sep 17 00:00:00 2001 From: Ryan Ly Date: Wed, 22 Jan 2020 15:09:22 -0800 Subject: [PATCH 2/5] Add comments, fix formatting --- src/pynwb/validate.py | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/pynwb/validate.py b/src/pynwb/validate.py index bc2358b1a..3c1dece83 100644 --- a/src/pynwb/validate.py +++ b/src/pynwb/validate.py @@ -36,14 +36,14 @@ def main(): parser = ArgumentParser(description="Validate an NWB file", epilog=ep) parser.add_argument("paths", type=str, nargs='+', help="NWB file paths") - parser.add_argument('-p', '--nspath', type=str, help="the path to the namespace YAML file") - parser.add_argument("-n", "--ns", type=str, help="the namespace to validate against") + parser.add_argument('-p', '--nspath', type=str, help="The path to the namespace YAML file") + parser.add_argument("-n", "--ns", type=str, help="The name of the namespace to validate against") feature_parser = parser.add_mutually_exclusive_group(required=False) feature_parser.add_argument("--cached-namespace", dest="cached_namespace", action='store_true', - help="Use the cached namespace (default).") + help="Validate against the cached namespaces (default).") feature_parser.add_argument('--no-cached-namespace', dest="cached_namespace", action='store_false', - help="Don't use the cached namespace.") + help="Don't validate against the cached namespaces.") parser.set_defaults(cached_namespace=True) args = parser.parse_args() @@ -55,31 +55,30 @@ def main(): sys.exit(1) if args.cached_namespace: - print("Turning off validation against cached namespace information" - "as --nspath was passed.", file=sys.stderr) + print("Turning off validation against cached namespace information as --nspath was passed.", + file=sys.stderr) args.cached_namespace = False for path in args.paths: - if not os.path.isfile(path): print("The file {} does not exist.".format(path), file=sys.stderr) ret = 1 continue - if args.cached_namespace: + if args.cached_namespace: # validate against the cached namespaces catalog = NamespaceCatalog(NWBGroupSpec, NWBDatasetSpec, NWBNamespace) namespaces = HDF5IO.load_namespaces(catalog, path).keys() if len(namespaces) > 0: tm = TypeMap(catalog) manager = BuildManager(tm) specloc = "cached namespace information" - else: + else: # no namespaces -- validate against NWB core namespace manager = None namespaces = [CORE_NAMESPACE] specloc = "pynwb namespace information" print("The file {} has no cached namespace information. " "Falling back to {}.".format(path, specloc), file=sys.stderr) - elif args.nspath: + elif args.nspath: # validate against a given namespace YAML file (e.g., from an extension) catalog = NamespaceCatalog(NWBGroupSpec, NWBDatasetSpec, NWBNamespace) namespaces = catalog.load_namespaces(args.nspath) @@ -90,22 +89,22 @@ def main(): tm = TypeMap(catalog) manager = BuildManager(tm) specloc = "--nspath namespace information" - else: + else: # validate against NWB core namespace manager = None namespaces = [CORE_NAMESPACE] specloc = "pynwb namespace information" - if args.ns: + if args.ns: # validate against a particular namespace out of the ones provided if args.ns in namespaces: namespaces = [args.ns] else: - print("The namespace {} could not be found in {}.".format(args.ns, specloc), file=sys.stderr) + print("The namespace '{}' could not be found in {}.".format(args.ns, specloc), file=sys.stderr) ret = 1 continue with NWBHDF5IO(path, mode='r', manager=manager) as io: for ns in namespaces: - print("Validating {} against {} using namespace {}.".format(path, specloc, ns)) + print("Validating {} against {} using namespace '{}'.".format(path, specloc, ns)) ret = ret or _validate_helper(io=io, namespace=ns) sys.exit(ret) From 0b9b15528dc7eb9d80265ce0fa3ef47b19aaf024 Mon Sep 17 00:00:00 2001 From: Ryan Ly Date: Wed, 22 Jan 2020 17:41:55 -0800 Subject: [PATCH 3/5] Add some tests for validate function and script --- test.py | 8 +- tests/validation/__init__.py | 0 tests/validation/test_validate.py | 139 ++++++++++++++++++++++++++++++ 3 files changed, 146 insertions(+), 1 deletion(-) create mode 100644 tests/validation/__init__.py create mode 100644 tests/validation/test_validate.py diff --git a/test.py b/test.py index 2d0b91859..82a7ec017 100755 --- a/test.py +++ b/test.py @@ -12,7 +12,7 @@ import unittest from tests.coloredtestrunner import ColoredTestRunner, ColoredTestResult -flags = {'pynwb': 2, 'integration': 3, 'example': 4, 'backwards': 5} +flags = {'pynwb': 2, 'integration': 3, 'example': 4, 'backwards': 5, 'validation': 6} TOTAL = 0 FAILURES = 0 @@ -149,10 +149,13 @@ def main(): help='run example tests') parser.add_argument('-b', '--backwards', action='append_const', const=flags['backwards'], dest='suites', help='run backwards compatibility tests') + parser.add_argument('-w', '--validation', action='append_const', const=flags['validation'], dest='suites', + help='run validation tests') args = parser.parse_args() if not args.suites: args.suites = list(flags.values()) args.suites.pop(args.suites.index(flags['example'])) # remove example as a suite run by default + args.suites.pop(args.suites.index(flags['validation'])) # remove validation as a suite run by default # set up logger root = logging.getLogger() @@ -186,6 +189,9 @@ def main(): if flags['backwards'] in args.suites: run_test_suite("tests/back_compat", "pynwb backwards compatibility tests", verbose=args.verbosity) + if flags['validation'] in args.suites: + run_test_suite("tests/validation", "pynwb validation tests", verbose=args.verbosity) + final_message = 'Ran %s tests' % TOTAL exitcode = 0 if ERRORS > 0 or FAILURES > 0: diff --git a/tests/validation/__init__.py b/tests/validation/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/validation/test_validate.py b/tests/validation/test_validate.py new file mode 100644 index 000000000..a939b682e --- /dev/null +++ b/tests/validation/test_validate.py @@ -0,0 +1,139 @@ +import subprocess +import re + +from pynwb.testing import TestCase +from pynwb import validate, NWBHDF5IO + + +class TestValidateScript(TestCase): + + # 1.0.2_nwbfile.nwb has no cached specifications + # 1.0.3_nwbfile.nwb has cached "core" specification + # 1.1.2_nwbfile.nwb has cached "core" and "hdmf-common" specifications + + def test_validate_file_no_cache(self): + """Test that validating a file with no cached spec against the core namespace succeeds.""" + result = subprocess.run("python -m pynwb.validate tests/back_compat/1.0.2_nwbfile.nwb", + capture_output=True) + + stderr_regex = re.compile( + r".*UserWarning: No cached namespaces found in tests/back_compat/1\.0\.2_nwbfile\.nwb\s*" + r"warnings.warn\(msg\)\s*" + r"The file tests/back_compat/1\.0\.2_nwbfile\.nwb has no cached namespace information\. " + r"Falling back to pynwb namespace information\.\s*" + ) + self.assertRegex(result.stderr.decode('utf-8'), stderr_regex) + + stdout_regex = re.compile( + r"Validating tests/back_compat/1\.0\.2_nwbfile\.nwb against pynwb namespace information using namespace " + r"'core'\.\s* - no errors found\.\s*") + self.assertRegex(result.stdout.decode('utf-8'), stdout_regex) + + def test_validate_file_no_cache_bad_ns(self): + """Test that validating a file with no cached spec against a specified, unknown namespace fails.""" + result = subprocess.run("python -m pynwb.validate tests/back_compat/1.0.2_nwbfile.nwb --ns notfound", + capture_output=True) + + stderr_regex = re.compile( + r".*UserWarning: No cached namespaces found in tests/back_compat/1\.0\.2_nwbfile\.nwb\s*" + r"warnings.warn\(msg\)\s*" + r"The file tests/back_compat/1\.0\.2_nwbfile\.nwb has no cached namespace information\. " + r"Falling back to pynwb namespace information\.\s*" + r"The namespace 'notfound' could not be found in pynwb namespace information\.\s*" + ) + self.assertRegex(result.stderr.decode('utf-8'), stderr_regex) + + self.assertEqual(result.stdout.decode('utf-8'), '') + + def test_validate_file_cached(self): + """Test that validating a file with cached spec against its cached namespace succeeds.""" + result = subprocess.run("python -m pynwb.validate tests/back_compat/1.1.2_nwbfile.nwb", + capture_output=True) + breakpoint() + + self.assertEqual(result.stderr.decode('utf-8'), '') + + stdout_regex = re.compile( + r"Validating tests/back_compat/1\.1\.2_nwbfile\.nwb against cached namespace information using namespace " + r"'core'\.\s* - no errors found\.\s*") + self.assertRegex(result.stdout.decode('utf-8'), stdout_regex) + + def test_validate_file_cached_bad_ns(self): + """Test that validating a file with cached spec against a specified, unknown namespace fails.""" + result = subprocess.run("python -m pynwb.validate tests/back_compat/1.1.2_nwbfile.nwb --ns notfound", + capture_output=True) + + stderr_regex = re.compile( + r"The namespace 'notfound' could not be found in cached namespace information\.\s*" + ) + self.assertRegex(result.stderr.decode('utf-8'), stderr_regex) + + self.assertEqual(result.stdout.decode('utf-8'), '') + + def test_validate_file_cached_hdmf_common(self): + """Test that validating a file with cached spec against the hdmf-common namespace fails.""" + result = subprocess.run("python -m pynwb.validate tests/back_compat/1.1.2_nwbfile.nwb --ns hdmf-common", + capture_output=True) + + stderr_regex = re.compile( + r".*ValueError: data type \'NWBFile\' not found in namespace hdmf-common.\s*", + re.DOTALL + ) + self.assertRegex(result.stderr.decode('utf-8'), stderr_regex) + + stdout_regex = re.compile( + r"Validating tests/back_compat/1.1.2_nwbfile.nwb against cached namespace information using namespace " + r"'hdmf-common'.\s*" + ) + self.assertRegex(result.stdout.decode('utf-8'), stdout_regex) + + def test_validate_file_cached_ignore(self): + """Test that validating a file with cached spec against the core namespace succeeds.""" + result = subprocess.run("python -m pynwb.validate tests/back_compat/1.1.2_nwbfile.nwb --no-cached-namespace", + capture_output=True) + + self.assertEqual(result.stderr.decode('utf-8'), '') + + stdout_regex = re.compile( + r"Validating tests/back_compat/1\.1\.2_nwbfile\.nwb against pynwb namespace information using namespace " + r"'core'\.\s* - no errors found\.\s*") + self.assertRegex(result.stdout.decode('utf-8'), stdout_regex) + + +class TestValidateFunction(TestCase): + + # 1.0.2_nwbfile.nwb has no cached specifications + # 1.0.3_nwbfile.nwb has cached "core" specification + # 1.1.2_nwbfile.nwb has cached "core" and "hdmf-common" specifications + + def test_validate_file_no_cache(self): + """Test that validating a file with no cached spec against the core namespace succeeds.""" + with NWBHDF5IO('tests/back_compat/1.0.2_nwbfile.nwb', 'r') as io: + errors = validate(io) + self.assertEqual(errors, []) + + def test_validate_file_no_cache_bad_ns(self): + """Test that validating a file with no cached spec against a specified, unknown namespace fails.""" + with NWBHDF5IO('tests/back_compat/1.0.2_nwbfile.nwb', 'r') as io: + with self.assertRaisesWith(KeyError, "\"'notfound' not a namespace\""): + validate(io, 'notfound') + + def test_validate_file_cached(self): + """Test that validating a file with cached spec against its cached namespace succeeds.""" + with NWBHDF5IO('tests/back_compat/1.1.2_nwbfile.nwb', 'r') as io: + errors = validate(io) + self.assertEqual(errors, []) + + def test_validate_file_cached_bad_ns(self): + """Test that validating a file with cached spec against a specified, unknown namespace fails.""" + with NWBHDF5IO('tests/back_compat/1.1.2_nwbfile.nwb', 'r') as io: + with self.assertRaisesWith(KeyError, "\"'notfound' not a namespace\""): + validate(io, 'notfound') + + def test_validate_file_cached_hdmf_common(self): + """Test that validating a file with cached spec against the hdmf-common namespace fails.""" + with NWBHDF5IO('tests/back_compat/1.1.2_nwbfile.nwb', 'r') as io: + # TODO this error should not be different from the error when using the validate script above + msg = "builder must have data type defined with attribute 'data_type'" + with self.assertRaisesWith(ValueError, msg): + validate(io, 'hdmf-common') From 75f4d6e31a5b808406675b2248f3860196d1c1a9 Mon Sep 17 00:00:00 2001 From: Ryan Ly Date: Wed, 22 Jan 2020 18:10:19 -0800 Subject: [PATCH 4/5] Add backward compatibility / validation test files --- src/pynwb/testing/make_test_files.py | 10 ++++++++++ tests/back_compat/1.2.1_extension.nwb | Bin 0 -> 154376 bytes tests/back_compat/1.2.1_nwbfile.nwb | Bin 0 -> 149488 bytes 3 files changed, 10 insertions(+) create mode 100644 tests/back_compat/1.2.1_extension.nwb create mode 100644 tests/back_compat/1.2.1_nwbfile.nwb diff --git a/src/pynwb/testing/make_test_files.py b/src/pynwb/testing/make_test_files.py index 161db19d0..ae6a0c0d6 100644 --- a/src/pynwb/testing/make_test_files.py +++ b/src/pynwb/testing/make_test_files.py @@ -48,3 +48,13 @@ def make_nwbfile_str_pub(): make_nwbfile() make_nwbfile_str_experimenter() make_nwbfile_str_pub() + + +# 1.2.1_extension.nwb was generated using the following: +# download ndx-miniscope.namespace.yaml and ndx-miniscope.extension.yaml from NDX Catalog +# from pynwb import load_namespaces, get_class +# load_namespaces('ndx-miniscope.namespace.yaml') +# Miniscope = get_class('Miniscope', 'ndx-miniscope') +# nwbfile.add_device(Miniscope('ADDME')) +# test_name = 'extension' +# _write(test_name, nwbfile) diff --git a/tests/back_compat/1.2.1_extension.nwb b/tests/back_compat/1.2.1_extension.nwb new file mode 100644 index 0000000000000000000000000000000000000000..20e94a71c24a6c32fb433d3d174629d7e26f7431 GIT binary patch literal 154376 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 literal 0 HcmV?d00001 diff --git a/tests/back_compat/1.2.1_nwbfile.nwb b/tests/back_compat/1.2.1_nwbfile.nwb new file mode 100644 index 0000000000000000000000000000000000000000..3e0ad8860e65a21d14aa222d3d52148ff214b246 GIT binary patch literal 149488 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 literal 0 HcmV?d00001 From 7efa67fba4dcbc8637e57968c16f85521817704d Mon Sep 17 00:00:00 2001 From: Ryan Ly Date: Sat, 1 Feb 2020 11:39:17 -0800 Subject: [PATCH 5/5] Use HDMF 1.6.0 --- requirements-min.txt | 2 +- requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements-min.txt b/requirements-min.txt index d462a1954..92cab9ef8 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.4,<2 +hdmf==1.6.0,<2 numpy==1.16 pandas==0.23 python-dateutil==2.7 diff --git a/requirements.txt b/requirements.txt index 3d8d7d180..e86a9a1da 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ h5py==2.10.0 -hdmf==1.5.4 +hdmf==1.6.0 numpy==1.18.1 pandas==0.25.3 python-dateutil==2.8.0