From 3fb3d6c03c3192d07dc243ce3213b98058e3f050 Mon Sep 17 00:00:00 2001 From: Brett Date: Tue, 23 Jan 2024 12:42:46 -0500 Subject: [PATCH] fix __asdf_traverse__ for non-tagged object --- asdf/_node_info.py | 3 ++- asdf/_tests/_regtests/test_1738.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 asdf/_tests/_regtests/test_1738.py diff --git a/asdf/_node_info.py b/asdf/_node_info.py index e61b22241..6f7439b3a 100644 --- a/asdf/_node_info.py +++ b/asdf/_node_info.py @@ -282,7 +282,8 @@ def from_root_node(cls, key, root_identifier, root_node, schema=None, refresh_ex if cls.traversable(node): t_node = node.__asdf_traverse__() - info.set_schema_from_node(node, extension_manager) + if hasattr(node, "_tag"): + info.set_schema_from_node(node, extension_manager) else: t_node = node diff --git a/asdf/_tests/_regtests/test_1738.py b/asdf/_tests/_regtests/test_1738.py new file mode 100644 index 000000000..2a2b09c89 --- /dev/null +++ b/asdf/_tests/_regtests/test_1738.py @@ -0,0 +1,28 @@ +import asdf + + +def test_info_on_non_tagged_asdf_traverse_object(): + """ + Calling info with a tree containing an object that implements + __asdf_traverse__ but does not have a _tag results in an + error + + https://github.com/asdf-format/asdf/issues/1738 + """ + + class MyContainer: + def __init__(self, data): + self.data = data + + def __asdf_traverse__(self): + return self.data + + c = MyContainer([1, 2, 3]) + af = asdf.AsdfFile() + af["c"] = c + + # info should not error out + af.info() + + # and search should work with the container + assert af.search(type_=int).paths == ["root['c'][0]", "root['c'][1]", "root['c'][2]"]