diff --git a/masque/test/test_ports2data.py b/masque/test/test_ports2data.py index 514ab9a..3f642ab 100644 --- a/masque/test/test_ports2data.py +++ b/masque/test/test_ports2data.py @@ -116,3 +116,17 @@ def test_data_to_ports_hierarchical_collision_is_atomic() -> None: data_to_ports([layer], lib, parent, max_depth=1) assert not parent.ports + + +def test_data_to_ports_flat_bad_angle_warns_and_skips( + caplog: pytest.LogCaptureFixture, + ) -> None: + layer = (10, 0) + pat = Pattern() + pat.label(layer=layer, string="A:type1 nope", offset=(5, 0)) + + caplog.set_level("WARNING") + data_to_ports([layer], {}, pat) + + assert not pat.ports + assert any('bad angle' in record.message for record in caplog.records) diff --git a/masque/utils/ports2data.py b/masque/utils/ports2data.py index 119ead1..44a0ec3 100644 --- a/masque/utils/ports2data.py +++ b/masque/utils/ports2data.py @@ -184,7 +184,14 @@ def data_to_ports_flat( name, property_string = label.string.split(':', 1) properties = property_string.split() ptype = properties[0] if len(properties) > 0 else 'unk' - angle_deg = float(properties[1]) if len(properties) > 1 else numpy.inf + if len(properties) > 1: + try: + angle_deg = float(properties[1]) + except ValueError: + logger.warning(f'Invalid port label "{label.string}" in pattern "{pstr}" (bad angle)') + continue + else: + angle_deg = numpy.inf xy = label.offset angle = numpy.deg2rad(angle_deg) if numpy.isfinite(angle_deg) else None