diff --git a/CHANGES.md b/CHANGES.md index 762db7e..0664596 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,11 @@ # XRLint Change History +## Version 0.5.2 (in development) + +- Fixed propagation of global DataTree attributes to child + Datasets and Variables. (#63) + + ## Version 0.5.1 (from 2025-02-21) - XRLint now also loads default configuration from files named diff --git a/xrlint/_linter/apply.py b/xrlint/_linter/apply.py index 8544717..803d56f 100644 --- a/xrlint/_linter/apply.py +++ b/xrlint/_linter/apply.py @@ -64,7 +64,18 @@ def apply_rule( def _visit_datatree_node(rule_op: RuleOp, context: RuleContextImpl, node: DataTreeNode): with context.use_state(node=node): rule_op.validate_datatree(context, node) + + current_attrs = node.datatree.attrs.copy() + if node.datatree.is_leaf: + dataset_copy = node.datatree.dataset.copy() + merged_dataset_attrs = { + **current_attrs, + **dataset_copy.attrs, + } + + dataset_copy.attrs = merged_dataset_attrs + _visit_dataset_node( rule_op, context, @@ -72,11 +83,18 @@ def _visit_datatree_node(rule_op: RuleOp, context: RuleContextImpl, node: DataTr parent=node, path=f"{node.path}/{node.datatree.name}", name=node.datatree.name, - dataset=node.datatree.dataset, + dataset=dataset_copy, ), ) else: for name, datatree in node.datatree.children.items(): + datatree_copy = datatree.copy() + + datatree_copy.attrs = { + **current_attrs, + **datatree_copy.attrs, + } + _visit_datatree_node( rule_op, context, @@ -84,7 +102,7 @@ def _visit_datatree_node(rule_op: RuleOp, context: RuleContextImpl, node: DataTr parent=node, path=f"{node.path}/{name}", name=name, - datatree=datatree, + datatree=datatree_copy, ), )