From abf128cb5da015a71b50a85679076a31d4db631c Mon Sep 17 00:00:00 2001 From: Nico Kemnitz Date: Thu, 2 Jul 2026 14:33:00 +0200 Subject: [PATCH] Add reference_double_float and reference_triple_float schemas Two reference annotation schemas for attaching a pair or triple of float values to another annotation (e.g. multiple per-synapse scores), complementing the single-value reference_tag_float. Both subclass ReferenceAnnotation (target_id + value fields, no tag) and register in type_mapping as reference_double_float / reference_triple_float. Co-Authored-By: Claude Opus 4.8 --- emannotationschemas/__init__.py | 6 +++ .../schemas/reference_float.py | 24 +++++++++++ tests/test_reference_float_schema.py | 40 +++++++++++++++++++ 3 files changed, 70 insertions(+) create mode 100644 emannotationschemas/schemas/reference_float.py create mode 100644 tests/test_reference_float_schema.py diff --git a/emannotationschemas/__init__.py b/emannotationschemas/__init__.py index d8fa67b..b853d4b 100644 --- a/emannotationschemas/__init__.py +++ b/emannotationschemas/__init__.py @@ -71,6 +71,10 @@ ProofreadingBoolStatusUser, ProofreadStatus, ) +from emannotationschemas.schemas.reference_float import ( + ReferenceDoubleFloat, + ReferenceTripleFloat, +) from emannotationschemas.schemas.reference_text_float import ( ReferenceTagFloat, ) @@ -138,6 +142,8 @@ "pt_bool_valid": SpatialPointBoolWithValid, "reference_integer": ReferenceInteger, "reference_tag_float": ReferenceTagFloat, + "reference_double_float": ReferenceDoubleFloat, + "reference_triple_float": ReferenceTripleFloat, "compartment_proofread_status_strategy": CompartmentProofreadStatusStrategy, "reference_tag_with_confidence": ReferenceTagWithConfidence, "digital_twin_properties": DigitalTwinPropertiesBCM, diff --git a/emannotationschemas/schemas/reference_float.py b/emannotationschemas/schemas/reference_float.py new file mode 100644 index 0000000..8c56a05 --- /dev/null +++ b/emannotationschemas/schemas/reference_float.py @@ -0,0 +1,24 @@ +import marshmallow as mm + +from emannotationschemas.schemas.base import ReferenceAnnotation + + +class ReferenceDoubleFloat(ReferenceAnnotation): + value = mm.fields.Float( + required=True, description="First float value attached to the annotation" + ) + value2 = mm.fields.Float( + required=True, description="Second float value attached to the annotation" + ) + + +class ReferenceTripleFloat(ReferenceAnnotation): + value = mm.fields.Float( + required=True, description="First float value attached to the annotation" + ) + value2 = mm.fields.Float( + required=True, description="Second float value attached to the annotation" + ) + value3 = mm.fields.Float( + required=True, description="Third float value attached to the annotation" + ) diff --git a/tests/test_reference_float_schema.py b/tests/test_reference_float_schema.py new file mode 100644 index 0000000..c9adff5 --- /dev/null +++ b/tests/test_reference_float_schema.py @@ -0,0 +1,40 @@ +import pytest +from marshmallow import ValidationError + +from emannotationschemas import get_schema, get_types +from emannotationschemas.schemas.reference_float import ( + ReferenceDoubleFloat, + ReferenceTripleFloat, +) + +target_id = 1 + + +def test_reference_double_float(): + result = ReferenceDoubleFloat().load( + {"target_id": target_id, "value": 0.5, "value2": 1.5} + ) + assert result["target_id"] == target_id + assert result["value"] == 0.5 + assert result["value2"] == 1.5 + + +def test_reference_triple_float(): + result = ReferenceTripleFloat().load( + {"target_id": target_id, "value": 0.1, "value2": 0.2, "value3": 0.3} + ) + assert result["value"] == 0.1 + assert result["value2"] == 0.2 + assert result["value3"] == 0.3 + + +def test_reference_double_float_missing_value(): + with pytest.raises(ValidationError): + ReferenceDoubleFloat().load({"target_id": target_id, "value": 0.5}) + + +def test_registered_in_type_mapping(): + assert get_schema("reference_double_float") is ReferenceDoubleFloat + assert get_schema("reference_triple_float") is ReferenceTripleFloat + assert "reference_double_float" in get_types() + assert "reference_triple_float" in get_types()