diff --git a/src/hdmf_zarr/backend.py b/src/hdmf_zarr/backend.py index f320683c..726bf39e 100644 --- a/src/hdmf_zarr/backend.py +++ b/src/hdmf_zarr/backend.py @@ -399,6 +399,13 @@ def export(self, **kwargs): ckwargs['clear_cache'] = True super().export(**ckwargs) if cache_spec: + # add any namespaces from the src_io that have not yet been loaded + for namespace in src_io.manager.namespace_catalog.namespaces: + if namespace not in self.manager.namespace_catalog.namespaces: + self.manager.namespace_catalog.add_namespace( + name=namespace, + namespace=src_io.manager.namespace_catalog.get_namespace(namespace) + ) self.__cache_spec() def get_written(self, builder, check_on_disk=False): diff --git a/src/hdmf_zarr/utils.py b/src/hdmf_zarr/utils.py index 19bf75b9..1c012a22 100644 --- a/src/hdmf_zarr/utils.py +++ b/src/hdmf_zarr/utils.py @@ -5,6 +5,7 @@ import math import json import logging +import os from collections import deque from collections.abc import Iterable from typing import Optional, Union, Literal, Tuple, Dict, Any @@ -373,12 +374,12 @@ class ZarrSpecReader(SpecReader): Class to read format specs from Zarr """ - @docval({'name': 'group', 'type': Group, 'doc': 'the Zarr file to read specs from'}, - {'name': 'source', 'type': str, 'doc': 'the path spec files are relative to', 'default': '.'}) + @docval({'name': 'group', 'type': Group, 'doc': 'the Zarr file to read specs from'}) def __init__(self, **kwargs): - self.__group, source = getargs('group', 'source', kwargs) - super_kwargs = {'source': source} - super(ZarrSpecReader, self).__init__(**super_kwargs) + self.__group = getargs('group', kwargs) + source = "%s:%s" % (os.path.abspath(self.__group.store.path), self.__group.name) + super().__init__(source=source) + self.__cache = None def __read(self, path): s = self.__group[path][0] @@ -391,8 +392,9 @@ def read_spec(self, spec_path): def read_namespace(self, ns_path): """Read a namespace from the given path""" - ret = self.__read(ns_path) - ret = ret['namespaces'] + if self.__cache is None: + self.__cache = self.__read(ns_path) + ret = self.__cache['namespaces'] return ret