diff --git a/masque/pattern.py b/masque/pattern.py index a630552..c649543 100644 --- a/masque/pattern.py +++ b/masque/pattern.py @@ -1829,6 +1829,8 @@ def map_layers( new_elements: defaultdict[layer_t, list[TT]] = defaultdict(list) for old_layer, seq in elements.items(): new_layer = map_layer(old_layer) + if new_layer is None: + raise PatternError(f'Layer mapping returned None for source layer {old_layer!r}') new_elements[new_layer].extend(seq) return new_elements diff --git a/masque/test/test_library.py b/masque/test/test_library.py index 32e7c3f..c205ec1 100644 --- a/masque/test/test_library.py +++ b/masque/test/test_library.py @@ -673,6 +673,15 @@ def test_layer_mapped_view_detaches_and_maps_shapes_and_labels() -> None: assert not hasattr(masque.library, 'PortsLibraryView') +def test_layer_mapped_view_preflight_rejects_none_layer() -> None: + pattern = Pattern() + pattern.polygon((1, 0), vertices=[[0, 0], [1, 0], [0, 1]]) + mapped = LayerMappedView(Library({'top': pattern}), lambda _layer: None) # type: ignore[arg-type] + + with pytest.raises(PatternError, match=r"returned None for source layer \(1, 0\)"): + preflight_source_aware(mapped) + + def test_layer_mapped_view_materialization_and_copy_through() -> None: pattern = Pattern() pattern.polygon('A', vertices=[[0, 0], [1, 0], [0, 1]])