diff --git a/src/substrait/simple_extension_utils.py b/src/substrait/simple_extension_utils.py index ad22f5f..e52f68b 100644 --- a/src/substrait/simple_extension_utils.py +++ b/src/substrait/simple_extension_utils.py @@ -170,6 +170,7 @@ def build_type_variation(d: dict) -> se.TypeVariation: def build_simple_extensions(d: dict) -> se.SimpleExtensions: return se.SimpleExtensions( urn=d["urn"], + description=d.get("description"), metadata=d.get("metadata"), dependencies=d.get("dependencies"), types=[build_type_model(t) for t in d["types"]] if "types" in d else None, diff --git a/tests/extension_registry/test_registry_lookup.py b/tests/extension_registry/test_registry_lookup.py index 642262f..ec8c017 100644 --- a/tests/extension_registry/test_registry_lookup.py +++ b/tests/extension_registry/test_registry_lookup.py @@ -225,3 +225,15 @@ def test_quantile_binds_return_type_to_distribution(registry): match = registry.lookup_function(_ARITHMETIC, "quantile", signature) assert match is not None assert match[1] == list_(fp64(nullable=False), nullable=True) + + +def test_decimal_avg_returns_nullable_decimal(registry): + # Since spec v0.105.0 ``avg`` over a decimal returns ``DECIMAL?<38,S>``: the + # average of an empty group is null even when the input is required. + match = registry.lookup_function( + "extension:io.substrait:functions_arithmetic_decimal", + "avg", + [decimal(2, 10, nullable=False)], + ) + assert match is not None + assert match[1] == decimal(2, 38, nullable=True) diff --git a/tests/test_simple_extension_utils.py b/tests/test_simple_extension_utils.py index 9a9ae0a..35094ad 100644 --- a/tests/test_simple_extension_utils.py +++ b/tests/test_simple_extension_utils.py @@ -49,3 +49,18 @@ def test_metadata_defaults_to_none_when_absent(): extensions = build_simple_extensions({"urn": "extension:test:no-metadata"}) assert extensions.metadata is None + + +def test_file_level_description_is_exposed(): + """Extension files can carry a top-level description (spec v0.105.0).""" + extensions = build_simple_extensions( + {"urn": "extension:test:described", "description": "Test functions.\n"} + ) + + assert extensions.description == "Test functions.\n" + + +def test_file_level_description_defaults_to_none_when_absent(): + extensions = build_simple_extensions({"urn": "extension:test:undescribed"}) + + assert extensions.description is None