From 86617e178dbd4924632141f5b094bdeff2f431e8 Mon Sep 17 00:00:00 2001 From: rly <310197+rly@users.noreply.github.com> Date: Wed, 6 May 2026 22:32:11 -0700 Subject: [PATCH] Fix load_namespace path when default_type_map is None The default_type_map=None branch of load_namespace called NamespaceCatalog with a positional default_namespace string and later read namespace_catalog.default_namespace, neither of which NamespaceCatalog accepts or exposes. The bug was unreachable when a TypeMap was supplied, so it only surfaces now that callers (e.g. nwb-schema PR #663) pass None to render docs from a local schema. - generate_format_docs.load_namespace: pass core_namespaces=[default_namespace] via keyword instead of the bogus positional, matching the actual NamespaceCatalog signature. - doctools.renderrst.SpecToRST.render_namespace: use namespace_catalog.core_namespaces[0] as the fallback when no namespace_name is given, raising on empty and warning when more than one core namespace is registered. Fixes #94. Co-Authored-By: Claude Opus 4.7 (1M context) --- hdmf_docutils/doctools/renderrst.py | 13 ++++++++++++- hdmf_docutils/generate_format_docs.py | 6 +++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/hdmf_docutils/doctools/renderrst.py b/hdmf_docutils/doctools/renderrst.py index b0a683f..309d7a1 100644 --- a/hdmf_docutils/doctools/renderrst.py +++ b/hdmf_docutils/doctools/renderrst.py @@ -7,6 +7,7 @@ from collections import OrderedDict from .rst import RSTDocument, RSTTable, RSTSectionLabelHelper import os +import warnings class DataTypeSection(dict): @@ -328,7 +329,17 @@ def render_namespace(namespace_catalog, ns_src_label = "hdmf-type-namespace-src" # Create the target doc if namespace_name is None: - namespace_name = namespace_catalog.default_namespace + core = namespace_catalog.core_namespaces + if not core: + raise ValueError( + "namespace_name not provided and namespace_catalog has no core namespaces" + ) + if len(core) > 1: + warnings.warn( + "namespace_name not provided; namespace_catalog has multiple core " + "namespaces %r. Using the first (%r)." % (core, core[0]) + ) + namespace_name = core[0] curr_namespace = namespace_catalog.get_namespace(namespace_name) # Section heading diff --git a/hdmf_docutils/generate_format_docs.py b/hdmf_docutils/generate_format_docs.py index 5813acb..fb418a7 100644 --- a/hdmf_docutils/generate_format_docs.py +++ b/hdmf_docutils/generate_format_docs.py @@ -118,10 +118,10 @@ def load_namespace(namespace_file, pass # Load the namespace separately if it already exists or we don't have a default type map specified if namespace_catalog is None: - namespace_catalog = NamespaceCatalog(default_namespace, - group_spec_cls=group_spec_cls, + namespace_catalog = NamespaceCatalog(group_spec_cls=group_spec_cls, dataset_spec_cls=dataset_spec_cls, - spec_namespace_cls=spec_namespace_cls) + spec_namespace_cls=spec_namespace_cls, + core_namespaces=[default_namespace]) namespace_catalog.load_namespaces(namespace_file, resolve=resolve) return namespace_catalog