codecov[bot]: # [Codecov](https://codecov.io/gh/hdmf-dev/hdmf/pull/203?src=pr&el=h1) Report
> :exclamation: No coverage uploaded for pull request base (`dev@42026c5`). [Click here to learn what that means](https://docs.codecov.io/docs/error-reference#section-missing-base-commit).
> The diff coverage is `66.66%`.

[![Impacted file tree graph](https://codecov.io/gh/hdmf-dev/hdmf/pull/203/graphs/tree.svg?width=650&token=PvIvUDjgcP&height=150&src=pr)](https://codecov.io/gh/hdmf-dev/hdmf/pull/203?src=pr&el=tree)

```diff
@@          Coverage Diff           @@
##             dev     #203   +/-   ##
======================================
  Coverage       ?   70.33%           
======================================
  Files          ?       30           
  Lines          ?     5956           
  Branches       ?     1399           
======================================
  Hits           ?     4189           
  Misses         ?     1329           
  Partials       ?      438
```


| [Impacted Files](https://codecov.io/gh/hdmf-dev/hdmf/pull/203?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [src/hdmf/utils.py](https://codecov.io/gh/hdmf-dev/hdmf/pull/203/diff?src=pr&el=tree#diff-c3JjL2hkbWYvdXRpbHMucHk=) | `89.7% <66.66%> (ø)` | |

------

[Continue to review full report at Codecov](https://codecov.io/gh/hdmf-dev/hdmf/pull/203?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/hdmf-dev/hdmf/pull/203?src=pr&el=footer). Last update [42026c5...64e0c65](https://codecov.io/gh/hdmf-dev/hdmf/pull/203?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).

diff --git a/src/hdmf/utils.py b/src/hdmf/utils.py
index 289c182..fd800c8 100644
--- a/src/hdmf/utils.py
+++ b/src/hdmf/utils.py
@@ -51,6 +51,8 @@ def __type_okay(value, argtype, allow_none=False):
             return __is_int(value)
         elif argtype == 'float':
             return __is_float(value)
+        elif argtype == 'bool':
+            return __is_bool(value)
         return argtype in [cls.__name__ for cls in value.__class__.__mro__]
     elif isinstance(argtype, type):
         if argtype == six.text_type:
@@ -61,6 +63,8 @@ def __type_okay(value, argtype, allow_none=False):
             return __is_int(value)
         elif argtype is float:
             return __is_float(value)
+        elif argtype is bool:
+            return __is_bool(value)
         return isinstance(value, argtype)
     elif isinstance(argtype, tuple) or isinstance(argtype, list):
         return any(__type_okay(value, i) for i in argtype)
@@ -100,6 +104,10 @@ def __is_float(value):
     return any(isinstance(value, i) for i in SUPPORTED_FLOAT_TYPES)
 
 
+def __is_bool(value):
+    return isinstance(value, bool) or isinstance(value, np.bool_)
+
+
 def __format_type(argtype):
     if isinstance(argtype, str):
         return argtype

Getting TypeError: incorrect type for 'bool' attribute in extension
I’m having a problem creating an [extension](https://github.com/ben-dichter-consulting/ndx-labmetadata-giocomo), more specifically, to create an attribute of type `bool`.

On the list of valid primary dtypes, I get:
{'isodatetime', 'datetime64', 'region', 'int8', 'int16', 'bool', 'int', 'ascii', 'int32', 'text', 'bytes', 'int64', 'utf-8', 'double', 'utf', 'datetime', 'uint32', 'uint', 'uint64', 'uint16', 'object', 'numeric', 'float32', 'float', 'short', 'float64', 'long', 'uint8', 'utf8'}

Then I try to add an attribute of type `bool`:
```python
    LabMetaData_ext.add_attribute(
        name='high_pass_filtered',
        doc='binary variable as to whether raw data was high-pass filtered or not',
        dtype='bool',
        shape=None,
    )
```
[Here’s](https://github.com/ben-dichter-consulting/ndx-labmetadata-giocomo/blob/master/src/spec/create_extension_spec.py) the full code.

When I run [this test](https://github.com/ben-dichter-consulting/ndx-labmetadata-giocomo/blob/master/src/pynwb/ndx_labmetadata_giocomo/test.py), it apparently works well in saving the nwb file with the new extension, I can even open the file with HDFView, but fails opening the new file with NWBHDF5IO. The error:

```
Traceback (most recent call last):
  File "C:\Users\Luiz\Anaconda3\envs\nwbn_conversion\lib\site-packages\hdmf\build\map.py", line 1207, in construct
    obj.__init__(**kwargs)
  File "C:\Users\Luiz\Anaconda3\envs\nwbn_conversion\lib\site-packages\hdmf\utils.py", line 436, in func_call
    raise_from(ExceptionType(msg), None)
  File "<string>", line 3, in raise_from
TypeError: incorrect type for 'high_pass_filtered' (got 'bool_', expected 'bool')

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "test.py", line 28, in <module>
    nwb = io.read()
  File "C:\Users\Luiz\Anaconda3\envs\nwbn_conversion\lib\site-packages\hdmf\backends\hdf5\h5tools.py", line 293, in read
    return call_docval_func(super(HDF5IO, self).read, kwargs)
  File "C:\Users\Luiz\Anaconda3\envs\nwbn_conversion\lib\site-packages\hdmf\utils.py", line 327, in call_docval_func
    return func(*fargs, **fkwargs)
  File "C:\Users\Luiz\Anaconda3\envs\nwbn_conversion\lib\site-packages\hdmf\utils.py", line 438, in func_call
    return func(self, **parsed['args'])
  File "C:\Users\Luiz\Anaconda3\envs\nwbn_conversion\lib\site-packages\hdmf\backends\io.py", line 35, in read
    container = self.__manager.construct(f_builder)
  File "C:\Users\Luiz\Anaconda3\envs\nwbn_conversion\lib\site-packages\hdmf\utils.py", line 438, in func_call
    return func(self, **parsed['args'])
  File "C:\Users\Luiz\Anaconda3\envs\nwbn_conversion\lib\site-packages\hdmf\build\map.py", line 208, in construct
    result = self.__type_map.construct(builder, self, None)
  File "C:\Users\Luiz\Anaconda3\envs\nwbn_conversion\lib\site-packages\hdmf\utils.py", line 438, in func_call
    return func(self, **parsed['args'])
  File "C:\Users\Luiz\Anaconda3\envs\nwbn_conversion\lib\site-packages\hdmf\build\map.py", line 1712, in construct
    return attr_map.construct(builder, build_manager, parent)
  File "C:\Users\Luiz\Anaconda3\envs\nwbn_conversion\lib\site-packages\hdmf\utils.py", line 438, in func_call
    return func(self, **parsed['args'])
  File "C:\Users\Luiz\Anaconda3\envs\nwbn_conversion\lib\site-packages\hdmf\build\map.py", line 1175, in construct
    subspecs = self.__get_subspec_values(builder, self.spec, manager)
  File "C:\Users\Luiz\Anaconda3\envs\nwbn_conversion\lib\site-packages\hdmf\build\map.py", line 1117, in __get_subspec_values
    self.__get_sub_builders(groups, spec.groups, manager, ret)
  File "C:\Users\Luiz\Anaconda3\envs\nwbn_conversion\lib\site-packages\hdmf\build\map.py", line 1155, in __get_sub_builders
    ret.update(self.__get_subspec_values(sub_builder, subspec, manager))
  File "C:\Users\Luiz\Anaconda3\envs\nwbn_conversion\lib\site-packages\hdmf\build\map.py", line 1117, in __get_subspec_values
    self.__get_sub_builders(groups, spec.groups, manager, ret)
  File "C:\Users\Luiz\Anaconda3\envs\nwbn_conversion\lib\site-packages\hdmf\build\map.py", line 1147, in __get_sub_builders
    sub_builder = self.__flatten(sub_builder, subspec, manager)
  File "C:\Users\Luiz\Anaconda3\envs\nwbn_conversion\lib\site-packages\hdmf\build\map.py", line 1160, in __flatten
    tmp = [manager.construct(b) for b in sub_builder]
  File "C:\Users\Luiz\Anaconda3\envs\nwbn_conversion\lib\site-packages\hdmf\build\map.py", line 1160, in <listcomp>
    tmp = [manager.construct(b) for b in sub_builder]
  File "C:\Users\Luiz\Anaconda3\envs\nwbn_conversion\lib\site-packages\hdmf\utils.py", line 438, in func_call
    return func(self, **parsed['args'])
  File "C:\Users\Luiz\Anaconda3\envs\nwbn_conversion\lib\site-packages\hdmf\build\map.py", line 204, in construct
    result = self.__type_map.construct(builder, self, parent)
  File "C:\Users\Luiz\Anaconda3\envs\nwbn_conversion\lib\site-packages\hdmf\utils.py", line 438, in func_call
    return func(self, **parsed['args'])
  File "C:\Users\Luiz\Anaconda3\envs\nwbn_conversion\lib\site-packages\hdmf\build\map.py", line 1712, in construct
    return attr_map.construct(builder, build_manager, parent)
  File "C:\Users\Luiz\Anaconda3\envs\nwbn_conversion\lib\site-packages\hdmf\utils.py", line 438, in func_call
    return func(self, **parsed['args'])
  File "C:\Users\Luiz\Anaconda3\envs\nwbn_conversion\lib\site-packages\hdmf\build\map.py", line 1210, in construct
    raise_from(Exception(msg), ex)
  File "<string>", line 3, in raise_from
Exception: Could not construct LabMetaData_ext object
```

I’m guessing the source is here?
```
TypeError: incorrect type for 'high_pass_filtered' (got 'bool_', expected 'bool')
```
Does anyone have a hint how to solve it?


##
    Python Version: 3.7
    Operating System: Windows
    HDMF Version: 1.3.3

## Checklist

- [x ] Have you ensured the feature or change was not already [reported](https://github.com/hdmf-dev/hdmf/issues) ?
- [ x] Have you included a brief and descriptive title?
- [ x] Have you included a clear description of the problem you are trying to solve?
- [ x] Have you included a minimal code snippet that reproduces the issue you are encountering?
- [ x] Have you checked our [Contributing](https://github.com/hdmf-dev/hdmf/blob/dev/docs/CONTRIBUTING.rst) document?

diff --git a/tests/unit/build_tests/test_io_map.py b/tests/unit/build_tests/test_io_map.py
index ae839dd..1405364 100644
--- a/tests/unit/build_tests/test_io_map.py
+++ b/tests/unit/build_tests/test_io_map.py
@@ -701,6 +701,22 @@ class TestConvertDtype(unittest.TestCase):
         self.assertTupleEqual(ret, match)
         self.assertIs(ret[0].dtype.type, match[1])
 
+    def test_bool_spec(self):
+        spec_type = 'bool'
+        spec = DatasetSpec('an example dataset', spec_type, name='data')
+
+        value = np.bool_(True)
+        ret = ObjectMapper.convert_dtype(spec, value)
+        match = (value, np.bool_)
+        self.assertTupleEqual(ret, match)
+        self.assertIs(type(ret[0]), match[1])
+
+        value = True
+        ret = ObjectMapper.convert_dtype(spec, value)
+        match = (value, np.bool_)
+        self.assertTupleEqual(ret, match)
+        self.assertIs(type(ret[0]), match[1])
+
 
 if __name__ == '__main__':
     unittest.main()
diff --git a/tests/unit/utils_test/test_docval.py b/tests/unit/utils_test/test_docval.py
index ebe23d1..5b711de 100644
--- a/tests/unit/utils_test/test_docval.py
+++ b/tests/unit/utils_test/test_docval.py
@@ -1,5 +1,6 @@
 import unittest
 from six import text_type
+import numpy as np
 
 from hdmf.utils import docval, fmt_docval_args, get_docval, popargs
 
@@ -478,6 +479,19 @@ class TestDocValidator(unittest.TestCase):
         with self.assertRaisesRegex(ValueError, r'Function __init__ has no docval arguments'):
             get_docval(self.test_obj.__init__, 'arg3')
 
+    def test_bool_type(self):
+        @docval({'name': 'arg1', 'type': bool, 'doc': 'this is a bool'})
+        def method(self, **kwargs):
+            return popargs('arg1', kwargs)
+
+        res = method(self, arg1=True)
+        self.assertEqual(res, True)
+        self.assertIsInstance(res, bool)
+
+        res = method(self, arg1=np.bool_(True))
+        self.assertEqual(res, np.bool_(True))
+        self.assertIsInstance(res, np.bool_)
+
 
 class TestDocValidatorChain(unittest.TestCase):
 

pip install -e .
parse_log_pytest
requirements.txt
tox flake8 pytest
apt-get update apt-get install -y gcc
3.7
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
cachetools==5.5.2
certifi @ file:///croot/certifi_1671487769961/work/certifi
chardet==5.2.0
colorama==0.4.6
distlib==0.3.9
exceptiongroup==1.2.2
filelock==3.12.2
flake8==3.9.2
h5py==2.10.0
-e git+https://github.com/hdmf-dev/hdmf.git@42026c5d7b30b7d176f75af7570b5e54c8ebadcd#egg=hdmf
importlib-metadata==6.7.0
iniconfig==2.0.0
mccabe==0.6.1
numpy==1.17.2
packaging==24.0
pandas==0.25.1
platformdirs==4.0.0
pluggy==1.2.0
pycodestyle==2.7.0
pyflakes==2.3.1
pyproject-api==1.5.3
pytest==7.4.4
python-dateutil==2.9.0.post0
pytz==2025.2
ruamel.yaml==0.16.5
ruamel.yaml.clib==0.2.8
scipy==1.3.1
six==1.12.0
tomli==2.0.1
tox==4.8.0
typing_extensions==4.7.1
virtualenv==20.26.6
zipp==3.15.0

name: hdmf
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2022.12.7=py37h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=22.3.1=py37h06a4308_0
  - python=3.7.16=h7a1cb2a_0
  - readline=8.2=h5eee18b_0
  - setuptools=65.6.3=py37h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.38.4=py37h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - cachetools==5.5.2
      - chardet==5.2.0
      - colorama==0.4.6
      - distlib==0.3.9
      - exceptiongroup==1.2.2
      - filelock==3.12.2
      - flake8==3.9.2
      - h5py==2.10.0
      - importlib-metadata==6.7.0
      - iniconfig==2.0.0
      - mccabe==0.6.1
      - numpy==1.17.2
      - packaging==24.0
      - pandas==0.25.1
      - platformdirs==4.0.0
      - pluggy==1.2.0
      - pycodestyle==2.7.0
      - pyflakes==2.3.1
      - pyproject-api==1.5.3
      - pytest==7.4.4
      - python-dateutil==2.9.0.post0
      - pytz==2025.2
      - ruamel-yaml==0.16.5
      - ruamel-yaml-clib==0.2.8
      - scipy==1.3.1
      - six==1.12.0
      - tomli==2.0.1
      - tox==4.8.0
      - typing-extensions==4.7.1
      - virtualenv==20.26.6
      - zipp==3.15.0
prefix: /opt/conda/envs/hdmf

tests/unit/utils_test/test_docval.py::TestDocValidator::test_bool_type
tests/unit/build_tests/test_io_map.py::TestGetSubSpec::test_get_subspec_data_type_noname tests/unit/build_tests/test_io_map.py::TestGetSubSpec::test_get_subspec_named tests/unit/build_tests/test_io_map.py::TestTypeMap::test_get_map tests/unit/build_tests/test_io_map.py::TestTypeMap::test_get_map_register tests/unit/build_tests/test_io_map.py::TestTypeMap::test_get_map_unique_mappers tests/unit/build_tests/test_io_map.py::TestMapStrings::test_build_1d tests/unit/build_tests/test_io_map.py::TestMapStrings::test_build_dataio tests/unit/build_tests/test_io_map.py::TestMapStrings::test_build_scalar tests/unit/build_tests/test_io_map.py::TestDynamicContainer::test_dynamic_container_composition tests/unit/build_tests/test_io_map.py::TestDynamicContainer::test_dynamic_container_composition_wrong_order tests/unit/build_tests/test_io_map.py::TestDynamicContainer::test_dynamic_container_constructor tests/unit/build_tests/test_io_map.py::TestDynamicContainer::test_dynamic_container_constructor_name tests/unit/build_tests/test_io_map.py::TestDynamicContainer::test_dynamic_container_constructor_name_default_name tests/unit/build_tests/test_io_map.py::TestDynamicContainer::test_dynamic_container_creation tests/unit/build_tests/test_io_map.py::TestDynamicContainer::test_dynamic_container_creation_defaults tests/unit/build_tests/test_io_map.py::TestDynamicContainer::test_dynamic_container_default_name tests/unit/build_tests/test_io_map.py::TestObjectMapperNested::test_build tests/unit/build_tests/test_io_map.py::TestObjectMapperNested::test_construct tests/unit/build_tests/test_io_map.py::TestObjectMapperNested::test_default_mapping tests/unit/build_tests/test_io_map.py::TestObjectMapperNested::test_default_mapping_keys tests/unit/build_tests/test_io_map.py::TestObjectMapperNested::test_remap_keys tests/unit/build_tests/test_io_map.py::TestObjectMapperNoNesting::test_build tests/unit/build_tests/test_io_map.py::TestObjectMapperNoNesting::test_build_empty tests/unit/build_tests/test_io_map.py::TestObjectMapperNoNesting::test_construct tests/unit/build_tests/test_io_map.py::TestObjectMapperNoNesting::test_default_mapping tests/unit/build_tests/test_io_map.py::TestObjectMapperNoNesting::test_default_mapping_keys tests/unit/build_tests/test_io_map.py::TestObjectMapperContainer::test_default_mapping tests/unit/build_tests/test_io_map.py::TestObjectMapperContainer::test_default_mapping_keys tests/unit/build_tests/test_io_map.py::TestLinkedContainer::test_build_child_link tests/unit/build_tests/test_io_map.py::TestConvertDtype::test_bool_spec tests/unit/build_tests/test_io_map.py::TestConvertDtype::test_convert_higher_precision tests/unit/build_tests/test_io_map.py::TestConvertDtype::test_keep_higher_precision tests/unit/build_tests/test_io_map.py::TestConvertDtype::test_no_spec tests/unit/build_tests/test_io_map.py::TestConvertDtype::test_numeric_spec tests/unit/build_tests/test_io_map.py::TestConvertDtype::test_value_none tests/unit/utils_test/test_docval.py::TestDocValidator::test_bad_shape tests/unit/utils_test/test_docval.py::TestDocValidator::test_bad_type tests/unit/utils_test/test_docval.py::TestDocValidator::test_catch_duplicate_names tests/unit/utils_test/test_docval.py::TestDocValidator::test_docval_add tests/unit/utils_test/test_docval.py::TestDocValidator::test_docval_add2 tests/unit/utils_test/test_docval.py::TestDocValidator::test_docval_add2_kw_all_kw_syntax tests/unit/utils_test/test_docval.py::TestDocValidator::test_docval_add2_kw_default tests/unit/utils_test/test_docval.py::TestDocValidator::test_docval_add2_kw_default_sub tests/unit/utils_test/test_docval.py::TestDocValidator::test_docval_add2_kw_default_sub_missing_args tests/unit/utils_test/test_docval.py::TestDocValidator::test_docval_add2_kw_kw_syntax tests/unit/utils_test/test_docval.py::TestDocValidator::test_docval_add2_kw_kwsyntax_sub tests/unit/utils_test/test_docval.py::TestDocValidator::test_docval_add2_kw_kwsyntax_sub_missing_args tests/unit/utils_test/test_docval.py::TestDocValidator::test_docval_add2_kw_kwsyntax_sub_nonetype_arg tests/unit/utils_test/test_docval.py::TestDocValidator::test_docval_add2_kw_pos_syntax tests/unit/utils_test/test_docval.py::TestDocValidator::test_docval_add2_kw_pos_syntax_missing_args tests/unit/utils_test/test_docval.py::TestDocValidator::test_docval_add2_pos_as_kw tests/unit/utils_test/test_docval.py::TestDocValidator::test_docval_add2_text_type_w_str tests/unit/utils_test/test_docval.py::TestDocValidator::test_docval_add2_text_type_w_unicode tests/unit/utils_test/test_docval.py::TestDocValidator::test_docval_add_kw tests/unit/utils_test/test_docval.py::TestDocValidator::test_docval_add_missing_args tests/unit/utils_test/test_docval.py::TestDocValidator::test_docval_add_sub tests/unit/utils_test/test_docval.py::TestDocValidator::test_dup_kw tests/unit/utils_test/test_docval.py::TestDocValidator::test_extra_args_dup_kw tests/unit/utils_test/test_docval.py::TestDocValidator::test_extra_args_pos_kw tests/unit/utils_test/test_docval.py::TestDocValidator::test_extra_args_pos_kw_ok tests/unit/utils_test/test_docval.py::TestDocValidator::test_extra_args_pos_only tests/unit/utils_test/test_docval.py::TestDocValidator::test_extra_args_pos_only_ok tests/unit/utils_test/test_docval.py::TestDocValidator::test_extra_kwarg tests/unit/utils_test/test_docval.py::TestDocValidator::test_extra_kwargs_pos_kw tests/unit/utils_test/test_docval.py::TestDocValidator::test_fmt_docval_args tests/unit/utils_test/test_docval.py::TestDocValidator::test_get_docval_all tests/unit/utils_test/test_docval.py::TestDocValidator::test_get_docval_missing_arg tests/unit/utils_test/test_docval.py::TestDocValidator::test_get_docval_missing_arg_of_many_ok tests/unit/utils_test/test_docval.py::TestDocValidator::test_get_docval_missing_args tests/unit/utils_test/test_docval.py::TestDocValidator::test_get_docval_none tests/unit/utils_test/test_docval.py::TestDocValidator::test_get_docval_none_arg tests/unit/utils_test/test_docval.py::TestDocValidator::test_get_docval_one_arg tests/unit/utils_test/test_docval.py::TestDocValidator::test_get_docval_two_args tests/unit/utils_test/test_docval.py::TestDocValidator::test_multi_shape tests/unit/utils_test/test_docval.py::TestDocValidator::test_only_kw_arg1_arg2 tests/unit/utils_test/test_docval.py::TestDocValidator::test_only_kw_arg1_arg2_pos tests/unit/utils_test/test_docval.py::TestDocValidator::test_only_kw_arg1_no_arg2 tests/unit/utils_test/test_docval.py::TestDocValidator::test_only_kw_arg1_pos_no_arg2 tests/unit/utils_test/test_docval.py::TestDocValidator::test_only_kw_arg2_no_arg1 tests/unit/utils_test/test_docval.py::TestDocValidator::test_only_kw_no_args tests/unit/utils_test/test_docval.py::TestDocValidator::test_unsupported_docval_term tests/unit/utils_test/test_docval.py::TestDocValidatorChain::test_shape_invalid_unpack tests/unit/utils_test/test_docval.py::TestDocValidatorChain::test_shape_invalid_unpack_default tests/unit/utils_test/test_docval.py::TestDocValidatorChain::test_shape_none_unpack tests/unit/utils_test/test_docval.py::TestDocValidatorChain::test_shape_none_unpack_default tests/unit/utils_test/test_docval.py::TestDocValidatorChain::test_shape_other_unpack tests/unit/utils_test/test_docval.py::TestDocValidatorChain::test_shape_other_unpack_default tests/unit/utils_test/test_docval.py::TestDocValidatorChain::test_shape_valid_unpack tests/unit/utils_test/test_docval.py::TestDocValidatorChain::test_shape_valid_unpack_default tests/unit/utils_test/test_docval.py::TestDocValidatorChain::test_type_arg tests/unit/utils_test/test_docval.py::TestDocValidatorChain::test_type_arg_wrong_type
src/hdmf/utils.py
src/hdmf/utils.py